change license
[apps/core/preloaded/music-player.git] / src / view / mp-edit-view.c
1 /*
2  * Copyright 2012         Samsung Electronics Co., Ltd
3  *
4  * Licensed under the Flora License, Version 1.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *  http://floralicense.org/license/
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16
17 #include "mp-edit-view.h"
18 #include "mp-view-layout.h"
19 #include "mp-library.h"
20 #include "mp-popup.h"
21 #include "mp-util.h"
22 #include "mp-widget.h"
23 #include "mp-common.h"
24 #include "mp-menu.h"
25 #include "mp-playlist-mgr.h"
26 #include "mp-playlist-view.h"
27 #include "mp-ctxpopup.h"
28
29 typedef enum {
30         MP_EDIT_THREAD_FEEDBACK_UNABLE_TO_ADD_PLST,
31         MP_EDIT_THREAD_FEEDBACK_CANCEL_BY_EXCEPTION,
32 } mp_edit_thread_feedback_e;
33
34 void
35 mp_edit_view_back_button_cb(void *data, Evas_Object * obj, void *event_info)
36 {
37         view_data_t *view_data = (view_data_t *) data;
38         MP_CHECK(view_data);
39         MP_CHECK_VIEW_DATA(view_data);
40
41         mp_retm_if(view_data->ad->navi_effect_in_progress, "navi effect in progress");
42
43         evas_object_smart_callback_del(obj, "clicked", mp_edit_view_back_button_cb);
44         mp_view_manager_pop_view_content(view_data, FALSE, FALSE);
45 }
46
47 static const char *
48 _mp_edit_view_get_view_title(mp_layout_data_t * layout_data)
49 {
50         const char *title = NULL;
51                 title = "IDS_COM_BODY_EDIT";
52
53         return title;
54 }
55
56 void
57 mp_edit_view_share_cb(void *data, Evas_Object * obj, void *event_info)
58 {
59         DEBUG_TRACE("");
60
61         mp_layout_data_t *layout_data = (mp_layout_data_t *) data;
62         MP_CHECK(layout_data);
63         MP_CHECK_LAYOUT_DATA(layout_data);
64
65         mp_retm_if(layout_data->ad->navi_effect_in_progress, "navi effect in progress");
66
67         if (layout_data->checked_count <= 0)
68         {
69                 mp_widget_text_popup(layout_data->ad, GET_STR("IDS_MUSIC_POP_NOTHING_SELECTED"));
70                 return;
71         }
72
73         mp_ctxpopup_create(obj, MP_CTXPOPUP_LIST_SHARE, data, layout_data->ad);
74
75         return;
76 }
77
78 void
79 mp_edit_view_create_new_cancel_cb(void *data, Evas_Object * obj, void *event_info)
80 {
81         DEBUG_TRACE("");
82         mp_layout_data_t *layout_data = (mp_layout_data_t *) data;
83         MP_CHECK(layout_data);
84         MP_CHECK_LAYOUT_DATA(layout_data);
85
86         mp_retm_if(layout_data->ad->navi_effect_in_progress, "navi effect in progress");
87
88         view_data_t *view_data = layout_data->view_data;
89         MP_CHECK(view_data);
90         MP_CHECK_VIEW_DATA(view_data);
91
92         mp_view_manager_pop_view_content(view_data, FALSE, TRUE);
93 }
94
95 void
96 mp_edit_view_create_new_done_cb(void *data, Evas_Object * obj, void *event_info)
97 {
98         DEBUG_TRACE_FUNC();
99         mp_playlist_h playlist_handle = NULL;
100         mp_layout_data_t *layout_data = (mp_layout_data_t *) data;
101         MP_CHECK(layout_data);
102         MP_CHECK_LAYOUT_DATA(layout_data);
103
104         mp_retm_if(layout_data->ad->navi_effect_in_progress, "navi effect in progress");
105
106         view_data_t *view_data = layout_data->view_data;
107         MP_CHECK(view_data);
108         MP_CHECK_VIEW_DATA(view_data);
109
110         struct appdata *ad = view_data->ad;
111         int plst_uid = -1;
112
113         char *converted_name = NULL;
114         Evas_Object *entry = mp_widget_editfield_entry_get(ad->editfiled_new_playlist);
115         const char *name = elm_entry_entry_get(entry);
116         if (name == NULL || strlen(name) == 0)
117         {
118                 name = elm_object_part_text_get(ad->editfiled_new_playlist, "elm.guidetext");
119         }
120         converted_name = elm_entry_markup_to_utf8(name);
121
122         if(layout_data->edit_playlist_handle)
123         {
124                 mp_media_info_playlist_handle_destroy(layout_data->edit_playlist_handle);
125                 layout_data->edit_playlist_handle = NULL;
126         }
127
128         plst_uid = mp_util_create_playlist(ad, converted_name, &playlist_handle);
129         IF_FREE(converted_name);
130         if (plst_uid < 0) {
131                 return;
132         }
133
134         mp_view_manager_pop_view_content(view_data, FALSE, TRUE);
135
136         layout_data->edit_playlist_id = plst_uid;
137         layout_data->edit_playlist_handle = playlist_handle;
138         mp_edit_view_excute_edit(layout_data, MP_EDIT_ADD_TO_PLAYLIST);
139
140         if (view_data->view_type == MP_VIEW_TYPE_PLAYLIST)
141                 mp_view_manager_update_list_contents(view_data, FALSE);
142
143 }
144
145 static void
146 _mp_edit_view_create_playlist_cb(void *data, Evas_Object * obj, void *event_info)
147 {
148         DEBUG_TRACE_FUNC();
149
150         mp_layout_data_t *layout_data = (mp_layout_data_t *) data;
151         MP_CHECK_LAYOUT_DATA(layout_data);
152         MP_CHECK(layout_data->ad);
153
154         view_data_t *view_data = layout_data->view_data;
155         MP_CHECK(view_data);
156         MP_CHECK_VIEW_DATA(view_data);
157         Evas_Object *create_plst_layout = NULL;
158         char *new_playlist_name = NULL;
159
160         new_playlist_name = mp_util_get_new_playlist_name();
161         create_plst_layout = mp_common_create_editfield_layout(view_data->navibar, view_data->ad, new_playlist_name);
162         IF_FREE(new_playlist_name);
163         mp_retm_if(create_plst_layout == NULL, "create_plst_layout is NULL");
164
165
166         Elm_Object_Item *it = mp_view_manager_push_view_content(view_data, create_plst_layout, MP_VIEW_CONTENT_NEW_PLAYLIST_BY_EDIT);
167         elm_object_item_text_set(it, GET_STR("IDS_MUSIC_BODY_CREATE_PLAYLIST"));
168         mp_language_mgr_register_object_item(it, "IDS_MUSIC_BODY_CREATE_PLAYLIST");
169
170         Evas_Object *btn = mp_widget_create_button(create_plst_layout, "naviframe/toolbar/default", GET_SYS_STR("IDS_COM_OPT_SAVE"), NULL, mp_edit_view_create_new_done_cb, layout_data);
171         elm_object_item_part_content_set(it, "title_toolbar_button1", btn);
172         btn = mp_widget_create_button(create_plst_layout, "naviframe/back_btn/default", NULL, NULL, mp_playlist_view_create_new_cancel_cb, view_data);
173         elm_object_item_part_content_set(it, "title_prev_btn", btn);
174
175         mp_common_add_keypad_state_callback(layout_data->ad->conformant, create_plst_layout, it);
176
177         mp_view_manager_set_back_button(create_plst_layout, it, mp_playlist_view_create_new_cancel_cb, view_data);
178
179         evas_object_show(create_plst_layout);
180
181         mp_popup_destroy(layout_data->ad);
182 }
183
184 static void
185 _mp_edit_view_add_to_playlist_cb(void *data, Evas_Object * obj, void *event_info)
186 {
187         startfunc;
188         MP_CHECK(data);
189
190         mp_layout_data_t *layout_data = (mp_layout_data_t *) evas_object_data_get(obj, "layout_data");
191         MP_CHECK(layout_data);
192         MP_CHECK_LAYOUT_DATA(layout_data);
193
194         layout_data->edit_playlist_id = (int)data;
195         mp_popup_destroy(layout_data->ad);
196         mp_edit_view_excute_edit(layout_data, MP_EDIT_ADD_TO_PLAYLIST);
197 }
198
199 static void _mp_edit_view_popup_del_cb(void *data, Evas * e, Evas_Object * eo, void *event_info)
200 {
201         mp_media_list_h list = data;
202         mp_media_info_group_list_destroy(list);
203 }
204
205 void
206 mp_edit_view_add_to_plst_cb(void *data, Evas_Object * obj, void *event_info)
207 {
208         DEBUG_TRACE("");
209         mp_layout_data_t *layout_data = (mp_layout_data_t *) data;
210         MP_CHECK(layout_data);
211         MP_CHECK_LAYOUT_DATA(layout_data);
212         MP_CHECK(layout_data->ad);
213
214         mp_retm_if(layout_data->ad->navi_effect_in_progress, "navi effect in progress");
215
216         bool b_from_more_btn = false;
217         if (layout_data->ad->more_btn_popup)
218                 b_from_more_btn = true;
219
220         mp_evas_object_del(layout_data->ad->more_btn_popup);
221
222         Evas_Object *popup = NULL;
223
224         if (layout_data->checked_count <= 0)
225         {
226                 mp_widget_text_popup(layout_data->ad, GET_STR("IDS_MUSIC_POP_NOTHING_SELECTED"));
227                 return;
228         }
229
230         popup = mp_genlist_popup_create(layout_data->ad->win_main, MP_POPUP_ADD_TO_PLST, data, layout_data->ad);
231         evas_object_data_set(popup, "layout_data", layout_data);
232         mp_retm_if(!popup, "popup is NULL !!!");
233
234         Evas_Object *genlist = evas_object_data_get(popup, "genlist");
235         evas_object_data_set(genlist, "layout_data", layout_data);
236
237         mp_genlist_popup_item_append(popup, GET_STR("IDS_MUSIC_OPT_CREATE_PLAYLIST"), NULL,
238                                      _mp_edit_view_create_playlist_cb, layout_data);
239         int i = 0, count = -1, ret = -1;
240
241         ret = mp_media_info_group_list_count(MP_GROUP_BY_PLAYLIST, NULL, NULL, &count);
242         if (ret != 0)
243         {
244                 ERROR_TRACE("Error in mp_media_info_group_list_count (%d)\n", ret);
245                 return;
246         }
247
248         if (count)
249         {
250                 mp_media_list_h list = NULL;
251
252                 ret = mp_media_info_group_list_create(&list, MP_GROUP_BY_PLAYLIST, NULL, NULL, 0, count);
253                 if (ret != 0)
254                 {
255                         WARN_TRACE("Fail to get playlist");
256                         return;
257                 }
258                 for (i = 0; i < count; i++)
259                 {
260                         char *name = NULL;
261                         int id;
262                         mp_media_info_h item = NULL;
263                         item = mp_media_info_group_list_nth_item(list, i);
264
265                         ret = mp_media_info_group_get_main_info(item, &name);
266                         mp_retm_if(ret != 0, "Fail to get value");
267                         ret = mp_media_info_group_get_playlist_id(item, &id);
268                         mp_retm_if(ret != 0, "Fail to get value");
269
270                         mp_genlist_popup_item_append(popup, name, NULL, _mp_edit_view_add_to_playlist_cb, (void *)id);
271                 }
272
273                 evas_object_event_callback_add(popup, EVAS_CALLBACK_DEL, _mp_edit_view_popup_del_cb, list);
274         }
275
276         evas_object_show(popup);
277 }
278
279 static Eina_Bool
280 _mp_edit_view_edit_idler_cb(void *data)
281 {
282         mp_layout_data_t *layout_data = (mp_layout_data_t *) data;
283         struct appdata *ad = NULL;
284         mp_genlist_item_data_t *item = NULL;
285         mp_media_info_h item_handle = NULL;
286         int ret = 0;
287         int plst_id = -1;
288         char *fid = NULL;
289         int uid = 0;
290         char *file_path;
291         bool error_occured = FALSE;
292
293         MP_CHECK_FALSE(layout_data);
294         MP_CHECK_LAYOUT_DATA(layout_data);
295
296         ad = layout_data->ad;
297         MP_CHECK_FALSE(ad);
298
299         if (!layout_data->current_edit_item)
300         {
301                 WARN_TRACE("CHECK here...");
302                 goto END;
303         }
304
305         if(elm_genlist_item_select_mode_get(layout_data->current_edit_item) == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
306         {
307                 layout_data->current_edit_item = elm_genlist_item_next_get(layout_data->current_edit_item);
308                 return EINA_TRUE;
309         }
310
311         item = elm_object_item_data_get(layout_data->current_edit_item);
312
313         if (!item)
314         {
315                 WARN_TRACE("CHECK here...");
316                 goto END;
317         }
318
319         if (MP_TRACK_BY_ALBUM == layout_data->track_type
320             || MP_TRACK_BY_ARTIST == layout_data->track_type)
321                 layout_data->category = MP_LAYOUT_TRACK_LIST;
322
323         if (item->checked)
324         {
325                 if (layout_data->edit_operation == MP_EDIT_DELETE)
326                 {
327                         switch (layout_data->category)
328                         {
329                         case MP_LAYOUT_PLAYLIST_LIST:
330                                 {
331                                         layout_data->current_edit_item =
332                                                 elm_genlist_item_next_get(layout_data->current_edit_item);
333                                         item_handle = (item->handle);
334                                         if (!item_handle)
335                                         {
336                                                 WARN_TRACE("CHECK here...");
337                                                 goto END;
338                                         }
339
340                                         ret = mp_media_info_group_get_playlist_id(item_handle, &plst_id);
341                                         MP_CHECK_EXCEP(ret == 0);
342
343                                         ret = mp_media_info_playlist_delete_from_db(plst_id);
344                                         MP_CHECK_EXCEP(ret == 0);
345
346                                         DEBUG_TRACE("playlist (%d) deleted", plst_id);
347                                         elm_object_item_del(item->it);
348                                         layout_data->item_count--;
349                                         layout_data->checked_count--;
350
351                                         break;
352                                 }
353                         case MP_LAYOUT_TRACK_LIST:
354                                 {
355                                         layout_data->current_edit_item =
356                                                 elm_genlist_item_next_get(layout_data->current_edit_item);
357                                         item_handle =  (item->handle);
358                                         if (item_handle)
359                                         {
360                                                 if (layout_data->playlist_id >= 0)
361                                                 {
362                                                         int member_id = 0;
363                                                         ret = mp_media_info_get_playlist_member_id(item_handle, &member_id);
364                                                         MP_CHECK_EXCEP(ret == 0);
365                                                         ret = mp_media_info_playlist_remove_media(layout_data->playlist_handle, member_id);
366                                                         MP_CHECK_EXCEP(ret == 0);
367                                                         DEBUG_TRACE("playlist id = %d, id = %d", plst_id, uid);
368                                                 }
369                                                 else if (layout_data->track_type == MP_TRACK_BY_ADDED_TIME)
370                                                 {
371                                                         ret = mp_media_info_set_added_time(item_handle, 0);
372                                                         MP_CHECK_EXCEP(ret == 0);
373                                                 }
374                                                 else if (layout_data->track_type == MP_TRACK_BY_PLAYED_TIME)
375                                                 {
376                                                         ret = mp_media_info_set_played_time(item_handle, 0);
377                                                         MP_CHECK_EXCEP(ret == 0);
378                                                 }
379                                                 else if (layout_data->track_type == MP_TRACK_BY_FAVORITE)
380                                                 {
381                                                         ret = mp_media_info_set_favorite(item_handle, false);
382                                                         MP_CHECK_EXCEP(ret == 0);
383                                                 }
384                                                 else if (layout_data->track_type == MP_TRACK_BY_PLAYED_COUNT)
385                                                 {
386                                                         ret = mp_media_info_set_played_count(item_handle, 0);
387                                                         MP_CHECK_EXCEP(ret == 0);
388                                                 }
389                                                 else
390                                                 {
391                                                         ret = mp_media_info_get_media_id(item_handle, &fid);
392                                                         ret = mp_media_info_get_file_path(item_handle, &file_path);
393                                                         MP_CHECK_EXCEP(ret == 0);
394                                                         if (mp_util_delete_track(layout_data->ad, fid, file_path, false) != MP_FILE_DELETE_ERR_NONE)
395                                                         {
396                                                                 DEBUG_TRACE("Fail to delete item, fid: %d, path: %s",
397                                                                             fid, file_path);
398                                                                 layout_data->error_count++;
399                                                                 error_occured = true;
400                                                         }
401                                                 }
402                                         }
403                                         if (!error_occured)
404                                         {
405                                                 if (MP_TRACK_BY_ARTIST == layout_data->track_type) {
406                                                         if(!elm_genlist_item_parent_get(elm_genlist_item_next_get(item->it))
407                                                                 && !elm_genlist_item_parent_get(elm_genlist_item_prev_get(item->it)))
408                                                         {
409                                                                 elm_object_item_del(elm_genlist_item_parent_get(item->it));
410                                                         }
411                                                         else
412                                                         {
413                                                                 elm_genlist_item_update(elm_genlist_item_parent_get(item->it));
414                                                         }
415                                                 } else if (MP_TRACK_BY_ALBUM == layout_data->track_type) {
416                                                         /* update group title */
417                                                         elm_genlist_item_update(layout_data->album_group);
418                                                 }
419                                                 elm_object_item_del(item->it);
420                                                 layout_data->item_count--;
421                                                 layout_data->checked_count--;
422                                         }
423                                         break;
424                                 }
425                         default:
426                                 WARN_TRACE("unexpected case...");
427                                 break;
428                         }
429                         mp_common_set_toolbar_button_sensitivity(layout_data, layout_data->checked_count);
430                 }
431                 else
432                 {
433                         WARN_TRACE("Unsupported operation...");
434                         goto mp_exception;
435                 }
436         }
437         else
438                 layout_data->current_edit_item = elm_genlist_item_next_get(layout_data->current_edit_item);
439
440         if (layout_data->current_edit_item)
441         {
442                 return EINA_TRUE;
443         }
444         DEBUG_TRACE("no more items");
445
446       END:
447         DEBUG_TRACE("");
448         mp_popup_response(ad->popup[MP_POPUP_PROGRESS], MP_POPUP_YES);
449         layout_data->edit_idler = NULL;
450         return EINA_FALSE;
451
452       mp_exception:
453         DEBUG_TRACE("");
454         if (layout_data->group_track_handle)
455         {
456                 mp_media_info_list_destroy(layout_data->group_track_handle);
457                 layout_data->group_track_handle = NULL;
458         }
459         mp_popup_response(ad->popup[MP_POPUP_PROGRESS], MP_POPUP_NO);
460         layout_data->edit_idler = NULL;
461         return EINA_FALSE;
462
463
464 }
465
466 static void
467 _mp_edit_view_progress_popup_response_cb(void *data, Evas_Object * obj, void *event_info)
468 {
469         DEBUG_TRACE("");
470         mp_layout_data_t *layout_data = (mp_layout_data_t *) data;
471         MP_CHECK(layout_data);
472         MP_CHECK_LAYOUT_DATA(layout_data);
473         MP_CHECK(obj);
474         mp_evas_object_del(obj);
475
476         struct appdata *ad = layout_data->ad;
477         MP_CHECK(ad);
478
479         if (layout_data->edit_idler)
480         {
481                 ecore_idler_del(layout_data->edit_idler);
482                 layout_data->edit_idler = NULL;
483         }
484
485         if (layout_data->edit_thread)
486         {
487                 ecore_thread_cancel(layout_data->edit_thread);
488                 layout_data->edit_thread = NULL;
489         }
490
491         if (layout_data->group_track_handle)
492         {
493                 mp_media_info_list_destroy(layout_data->group_track_handle);
494                 layout_data->group_track_handle = NULL;
495         }
496
497         if(mp_view_manager_count_view_content(layout_data->view_data) >= 1)
498                 mp_view_manager_update_list_contents(layout_data->view_data, TRUE);
499
500         int selected_count = layout_data->selected_count;
501
502         mp_edit_view_cencel_cb(layout_data, NULL, NULL);
503
504         DEBUG_TRACE("selected_count, %d, error_count: %d", selected_count, layout_data->error_count);
505
506         if (layout_data->edit_operation == MP_EDIT_ADD_TO_PLAYLIST)
507         {
508                 if (selected_count)
509                         mp_util_post_status_message(layout_data->ad, GET_STR("IDS_MUSIC_POP_ADDED"));
510         }
511         else
512         {
513                 if ((selected_count == 1) && layout_data->error_count)
514                 {
515                         if ((layout_data->category == MP_LAYOUT_TRACK_LIST)
516                             && (layout_data->view_data->view_type == MP_VIEW_TYPE_PLAYLIST))
517                         {
518                                 mp_util_post_status_message(layout_data->ad, GET_SYS_STR("IDS_COM_POP_FAILED"));
519                         }
520                         else
521                         {
522                                 mp_util_post_status_message(layout_data->ad, GET_SYS_STR("IDS_COM_POP_FAILED"));
523                         }
524                 }
525                 else
526                 {
527                         if ((layout_data->category == MP_LAYOUT_TRACK_LIST)
528                             && (layout_data->view_data->view_type == MP_VIEW_TYPE_PLAYLIST))
529                         {
530                                 mp_util_post_status_message(layout_data->ad, GET_SYS_STR("IDS_COM_POP_REMOVED"));
531                         }
532                         else
533                         {
534                                 mp_util_post_status_message(layout_data->ad, GET_SYS_STR("IDS_COM_POP_DELETED"));
535                         }
536                 }
537         }
538
539         layout_data->ad->edit_in_progress = false;
540
541         if (layout_data->edit_operation == MP_EDIT_ADD_TO_PLAYLIST && layout_data->ad->b_add_tracks)
542         {
543                 layout_data->ad->b_add_tracks = FALSE;
544                 mp_view_layout_reset_select_all(layout_data);
545                 elm_toolbar_item_selected_set(layout_data->ad->library->ctltab_plist, EINA_TRUE);
546
547                 if (selected_count)
548                         mp_util_post_status_message(ad, GET_STR("IDS_MUSIC_POP_ADDED"));
549         }
550
551 }
552
553 static void
554 _mp_edit_view_add_to_plst_thread(void *data, Ecore_Thread *thread)
555 {
556         mp_layout_data_t *layout_data = data;
557         MP_CHECK(layout_data);
558         MP_CHECK_LAYOUT_DATA(layout_data);
559
560         struct appdata *ad = layout_data->ad;
561         MP_CHECK(ad);
562
563         mp_genlist_item_data_t *item = NULL;
564         mp_media_info_h item_handle = NULL;
565         int ret = 0;
566         char *fid = NULL;
567         char *title = NULL;
568
569         if (MP_TRACK_BY_ALBUM == layout_data->track_type || MP_TRACK_BY_ARTIST == layout_data->track_type)
570                 layout_data->category = MP_LAYOUT_TRACK_LIST;
571
572         while (layout_data->current_edit_item)
573         {
574                 if (ecore_thread_check(thread)) {       // pending cancellation
575                         WARN_TRACE("popup cancel clicked");
576                         goto mp_exception;
577                 }
578
579                 if(elm_genlist_item_select_mode_get(layout_data->current_edit_item) == ELM_OBJECT_SELECT_MODE_DISPLAY_ONLY)
580                 {
581                         layout_data->current_edit_item = elm_genlist_item_next_get(layout_data->current_edit_item);
582                         continue;
583                 }
584
585                 item = elm_object_item_data_get(layout_data->current_edit_item);
586                 if (!item)
587                 {
588                         WARN_TRACE("CHECK here...");
589                         ecore_thread_feedback(thread, (void *)MP_EDIT_THREAD_FEEDBACK_CANCEL_BY_EXCEPTION);
590                         goto mp_exception;
591                 }
592
593                 if (!item->checked)
594                 {
595                         layout_data->current_edit_item = elm_genlist_item_next_get(layout_data->current_edit_item);
596                         continue;
597                 }
598
599 #ifdef MP_PLAYLIST_MAX_ITEM_COUNT
600                 if (layout_data->playlist_track_count >= MP_PLAYLIST_MAX_ITEM_COUNT)
601                 {
602                         DEBUG_TRACE("unable to add more tracks...");
603                         ecore_thread_feedback(thread, (void *)MP_EDIT_THREAD_FEEDBACK_CANCEL_BY_EXCEPTION);
604                         goto mp_exception;
605                 }
606 #endif
607                 switch (layout_data->category) {
608                 case MP_LAYOUT_TRACK_LIST:
609                 {
610                         item_handle =  (item->handle);
611                         if (item_handle)
612                         {
613                                 ret = mp_media_info_get_media_id(item_handle,  &fid);
614                                 MP_CHECK_EXCEP(ret == 0);
615
616                                 if (!mp_util_add_to_playlist_by_key(layout_data->edit_playlist_id, fid))
617                                 {
618                                         ecore_thread_feedback(thread, (void *)MP_EDIT_THREAD_FEEDBACK_UNABLE_TO_ADD_PLST);
619                                         ecore_thread_feedback(thread, (void *)MP_EDIT_THREAD_FEEDBACK_CANCEL_BY_EXCEPTION);
620                                         goto mp_exception;
621                                 }
622                                 else
623                                         layout_data->playlist_track_count++;
624                         }
625
626                         layout_data->current_edit_item = elm_genlist_item_next_get(layout_data->current_edit_item);
627                         break;
628                 }
629                 case MP_LAYOUT_GROUP_LIST:
630                 {
631                         item_handle =  (item->handle);
632                         if (item_handle)
633                         {
634                                 mp_track_type_e item_type = MP_TRACK_ALL;
635                                 int count = 0;
636                                 mp_media_info_h item = NULL;
637
638                                 if (layout_data->view_data->view_type == MP_VIEW_TYPE_FOLDER)
639                                 {
640                                         ret = mp_media_info_group_get_folder_id(item_handle, &title);
641                                 }
642                                 else
643                                 {
644                                         ret = mp_media_info_group_get_main_info(item_handle, &title);
645                                 }
646                                 MP_CHECK_EXCEP(ret == 0);
647                                 MP_CHECK_EXCEP(title);
648
649                                 item_type = mp_menu_get_track_type_by_group(layout_data->group_type);
650                                 if (!layout_data->group_track_handle)
651                                 {
652                                         ret = mp_media_info_list_count(item_type, title, NULL, NULL, 0, &count);
653
654                                         MP_CHECK_EXCEP(ret == 0);
655                                         MP_CHECK_EXCEP(count > 0);
656                                         mp_debug("track_count: %d", count);
657
658                                         ret = mp_media_info_list_create(&layout_data->group_track_handle, item_type, title, NULL, NULL, 0, 0, count);
659                                         MP_CHECK_EXCEP(ret == 0);
660
661                                         layout_data->edit_track_index = count - 1;
662                                         layout_data->group_item_delete_error = false;
663                                 }
664
665                                 item = mp_media_info_list_nth_item(layout_data->group_track_handle, layout_data->edit_track_index);
666                                 ret = mp_media_info_get_media_id(item, &fid);
667                                 MP_CHECK_EXCEP(ret == 0);
668
669                                 if (!mp_util_add_to_playlist_by_key(layout_data->edit_playlist_id, fid))
670                                 {
671                                         ecore_thread_feedback(thread, (void *)MP_EDIT_THREAD_FEEDBACK_CANCEL_BY_EXCEPTION);
672                                         goto mp_exception;
673                                 }
674                                 else
675                                         layout_data->playlist_track_count++;
676
677                                 if (layout_data->edit_track_index <= 0)
678                                 {
679                                         DEBUG_TRACE("all tracks in %s added.", title);
680                                         layout_data->current_edit_item = elm_genlist_item_next_get(layout_data->current_edit_item);
681                                         mp_media_info_list_destroy(layout_data->group_track_handle);
682                                         layout_data->group_track_handle = NULL;
683                                 }
684                                 else
685                                         layout_data->edit_track_index--;
686
687                         }
688                         break;
689                 }
690                 default:
691                         WARN_TRACE("unexpected case...");
692                         break;
693                 }
694         }
695
696 mp_exception:
697         if (layout_data->group_track_handle) {
698                 mp_media_info_list_destroy(layout_data->group_track_handle);
699                 layout_data->group_track_handle = NULL;
700         }
701 }
702
703 static void
704 _mp_edit_view_edit_thread_notify_cb(void *data, Ecore_Thread *thread, void *msg_data)
705 {
706         DEBUG_TRACE("");
707         mp_layout_data_t *layout_data = data;
708         MP_CHECK(layout_data);
709         MP_CHECK_LAYOUT_DATA(layout_data);
710
711         struct appdata *ad = layout_data->ad;
712         MP_CHECK(ad);
713
714         mp_edit_thread_feedback_e feedback = (mp_edit_thread_feedback_e)msg_data;
715         switch (feedback) {
716         case MP_EDIT_THREAD_FEEDBACK_UNABLE_TO_ADD_PLST:
717                 mp_widget_text_popup(ad, GET_STR("IDS_MUSIC_POP_UNABLE_TO_ADD"));
718                 break;
719
720         case MP_EDIT_THREAD_FEEDBACK_CANCEL_BY_EXCEPTION:
721                 mp_popup_response(ad->popup[MP_POPUP_PROGRESS], MP_POPUP_NO);
722                 break;
723
724         default:
725                 WARN_TRACE("Not defined feedback .. [%d]", feedback);
726         }
727 }
728
729 static void
730 _mp_edit_view_edit_thread_end_cb(void *data, Ecore_Thread *thread)
731 {
732         WARN_TRACE("thread_end");
733         mp_layout_data_t *layout_data = data;
734         MP_CHECK(layout_data);
735         MP_CHECK_LAYOUT_DATA(layout_data);
736         layout_data->edit_thread = NULL;
737
738         struct appdata *ad = layout_data->ad;
739         MP_CHECK(ad);
740
741         mp_popup_response(ad->popup[MP_POPUP_PROGRESS], MP_POPUP_YES);
742 }
743
744 static void
745 _mp_edit_view_edit_thread_cancel_cb(void *data, Ecore_Thread *thread)
746 {
747         WARN_TRACE("thread_cancel");
748 }
749
750 void
751 mp_edit_view_excute_edit(mp_layout_data_t * layout_data, mp_edit_operation_t edit_operation)
752 {
753         MP_CHECK(layout_data);
754         MP_CHECK_LAYOUT_DATA(layout_data);
755
756         struct appdata *ad = layout_data->ad;
757         MP_CHECK(ad);
758
759         Elm_Object_Item *first_item = elm_genlist_first_item_get(layout_data->genlist);
760         MP_CHECK(first_item);
761         layout_data->current_edit_item = first_item;
762
763         if (layout_data->edit_idler)
764         {
765                 ecore_idler_del(layout_data->edit_idler);
766                 layout_data->edit_idler = NULL;
767         }
768
769         layout_data->selected_count = layout_data->checked_count;
770         layout_data->error_count = 0;
771         layout_data->group_track_handle = NULL;
772         layout_data->group_item_delete_error = false;
773         layout_data->edit_operation = edit_operation;
774
775         if (edit_operation == MP_EDIT_ADD_TO_PLAYLIST)
776         {
777                 mp_media_info_list_count(MP_TRACK_BY_PLAYLIST, NULL, NULL, NULL, layout_data->edit_playlist_id, &layout_data->playlist_track_count);
778                 DEBUG_TRACE("number of tracks in playlist: %d", layout_data->playlist_track_count);
779 #ifdef MP_PLAYLIST_MAX_ITEM_COUNT
780                 if (layout_data->playlist_track_count >= MP_PLAYLIST_MAX_ITEM_COUNT)
781                 {
782                         if (layout_data->ad->b_add_tracks)
783                         {
784                                 layout_data->ad->b_add_tracks = FALSE;
785                                 mp_view_layout_reset_select_all(layout_data);
786                                 elm_toolbar_item_selected_set(layout_data->ad->library->ctltab_plist, EINA_TRUE);
787                         }
788                         char *fmt_str = GET_STR("IDS_MUSIC_POP_UNABLE_TO_ADD_MORE_THAN_PD_MUSIC_FILE");
789                         char *noti_str = g_strdup_printf(fmt_str, MP_PLAYLIST_MAX_ITEM_COUNT);
790                         mp_util_post_status_message(ad, noti_str);
791                         IF_FREE(noti_str);
792                         return;
793                 }
794 #endif
795         }
796
797
798         if (edit_operation == MP_EDIT_ADD_TO_PLAYLIST)
799         {
800                 mp_popup_create(ad->win_main, MP_POPUP_PROGRESS, GET_STR("IDS_MUSIC_BODY_ADD_TO_PLAYLIST"), layout_data,
801                                 _mp_edit_view_progress_popup_response_cb, ad);
802
803                 layout_data->edit_thread = ecore_thread_feedback_run(
804                                                 _mp_edit_view_add_to_plst_thread,
805                                                 _mp_edit_view_edit_thread_notify_cb,
806                                                 _mp_edit_view_edit_thread_end_cb,
807                                                 _mp_edit_view_edit_thread_cancel_cb,
808                                                 (const void *)layout_data,
809                                                 EINA_TRUE);
810
811                 if (!layout_data->edit_thread) {
812                         mp_popup_response(ad->popup[MP_POPUP_PROGRESS], MP_POPUP_NO);
813                 }
814         }
815         else
816         {
817                 layout_data->edit_idler = ecore_idler_add(_mp_edit_view_edit_idler_cb, layout_data);
818
819                 DEBUG_TRACE("layout_data->category=%d=====layout_data->view_data->view_type=%d\n",
820                             layout_data->category, layout_data->view_data->view_type);
821                 if ((layout_data->category == MP_LAYOUT_TRACK_LIST)
822                     && (layout_data->view_data->view_type == MP_VIEW_TYPE_PLAYLIST))
823                 {
824                         mp_popup_create(ad->win_main, MP_POPUP_PROGRESS, GET_SYS_STR("IDS_COM_SK_REMOVE"), layout_data,
825                                         _mp_edit_view_progress_popup_response_cb, ad);
826                 }
827                 else
828                 {
829                         mp_popup_create(ad->win_main, MP_POPUP_PROGRESS, GET_SYS_STR("IDS_COM_OPT_DELETE"), layout_data,
830                                         _mp_edit_view_progress_popup_response_cb, ad);
831                 }
832         }
833         ad->edit_in_progress = true;
834
835 }
836
837 static void
838 _mp_edit_view_excute_delete_cb(void *data, Evas_Object * obj, void *event_info)
839 {
840         startfunc;
841         mp_layout_data_t *layout_data = (mp_layout_data_t *) data;
842         MP_CHECK(layout_data);
843         MP_CHECK_LAYOUT_DATA(layout_data);
844
845         MP_CHECK(layout_data->ad);
846         layout_data->ad->popup_delete = NULL;
847
848         mp_evas_object_del(obj);
849
850         int response = (int)event_info;
851         if (response == MP_POPUP_NO)
852         {
853                 return;
854         }
855         ERROR_TRACE("0x%x", layout_data->layout);
856         mp_edit_view_excute_edit(layout_data, MP_EDIT_DELETE);
857
858         endfunc;
859         return;
860 }
861
862 void
863 mp_edit_view_cencel_cb(void *data, Evas_Object * obj, void *event_info)
864 {
865         DEBUG_TRACE("");
866         struct appdata *ad = NULL;
867         mp_layout_data_t *layout_data = (mp_layout_data_t *) data;
868         MP_CHECK(layout_data);
869         MP_CHECK_LAYOUT_DATA(layout_data);
870
871         mp_retm_if(layout_data->ad->navi_effect_in_progress, "navi effect in progress");
872
873         ad = layout_data->ad;
874
875         mp_view_layout_set_edit_mode(layout_data, false);
876         mp_util_unset_rename(layout_data); /* Cancel the rename mode */
877
878 }
879
880 void
881 mp_edit_view_delete_cb(void *data, Evas_Object * obj, void *event_info)
882 {
883         DEBUG_TRACE("");
884         struct appdata *ad = NULL;
885         mp_layout_data_t *layout_data = (mp_layout_data_t *) data;
886         MP_CHECK(layout_data);
887         MP_CHECK_LAYOUT_DATA(layout_data);
888         ERROR_TRACE("0x%x", layout_data->layout);
889
890         mp_retm_if(layout_data->ad->navi_effect_in_progress, "navi effect in progress");
891
892         if (layout_data->checked_count <= 0)
893         {
894                 mp_widget_text_popup(layout_data->ad, GET_STR("IDS_MUSIC_POP_NOTHING_SELECTED"));
895                 return;
896         }
897
898         ad = layout_data->ad;
899
900         Evas_Object *popup = mp_popup_create(ad->win_main, MP_POPUP_NORMAL, NULL, layout_data, _mp_edit_view_excute_delete_cb, ad);
901         evas_object_data_set(popup, "layout_data", layout_data);
902         ad->popup_delete = popup;
903
904         evas_object_size_hint_weight_set(popup, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
905         if ((layout_data->category == MP_LAYOUT_TRACK_LIST)
906             && (layout_data->view_data->view_type == MP_VIEW_TYPE_PLAYLIST))
907         {
908                 elm_object_text_set(popup, GET_STR("IDS_MUSIC_POP_REMOVE_Q"));
909         }
910         else
911         {
912                 elm_object_text_set(popup, GET_SYS_STR("IDS_COM_POP_DELETE_Q"));
913         }
914
915         mp_popup_button_set(popup, MP_POPUP_BTN_1, GET_SYS_STR("IDS_COM_SK_YES"), MP_POPUP_YES);
916         mp_popup_button_set(popup, MP_POPUP_BTN_2, GET_SYS_STR("IDS_COM_SK_NO"), MP_POPUP_NO);
917
918         evas_object_show(popup);
919
920 }
921
922 void
923 mp_edit_view_genlist_sel_cb(void *data, Evas_Object * obj, void *event_info)
924 {
925         mp_layout_data_t *layout_data = evas_object_data_get(obj, "layout_data");
926         mp_retm_if(!layout_data, "layout_data is NULL !!!!");
927         MP_CHECK_LAYOUT_DATA(layout_data);
928
929         mp_retm_if(layout_data->ad->navi_effect_in_progress, "navi effect in progress");
930
931         Elm_Object_Item *gli = (Elm_Object_Item *) event_info;
932         elm_genlist_item_selected_set(gli, FALSE);
933
934         if (elm_genlist_item_flip_get(gli))
935         {
936                 return;
937         }
938
939         mp_genlist_item_data_t *item = (mp_genlist_item_data_t *) elm_object_item_data_get(gli);
940         MP_CHECK(item);
941         item->checked = !item->checked;
942
943         if (item->checked)
944                 layout_data->checked_count++;
945         else
946                 layout_data->checked_count--;
947
948         if (layout_data->select_all_layout)
949         {
950                 if (layout_data->item_count == layout_data->checked_count)
951                         layout_data->select_all_checked = EINA_TRUE;
952                 else
953                         layout_data->select_all_checked = EINA_FALSE;
954
955                 elm_check_state_pointer_set(layout_data->select_all_checkbox, &layout_data->select_all_checked);
956         }
957
958         elm_genlist_item_fields_update(item->it, "elm.edit.icon.1", ELM_GENLIST_ITEM_FIELD_CONTENT);
959         mp_util_create_selectioninfo_with_count(layout_data->layout, layout_data->checked_count);
960         mp_common_set_toolbar_button_sensitivity(layout_data, layout_data->checked_count);
961 }
962
963 Evas_Object *
964 mp_edit_view_create(view_data_t * view_data)
965 {
966         DEBUG_TRACE("");
967         MP_CHECK_NULL(view_data);
968         MP_CHECK_VIEW_DATA(view_data);
969         int reorder = FALSE;
970
971         mp_common_hide_search_ise_context(view_data);
972
973         Evas_Object *top_view = mp_view_manager_get_last_view_layout(view_data->ad);
974         mp_retvm_if(!top_view, NULL, "top view must exist...");
975         mp_layout_data_t *layout_data = evas_object_data_get(top_view, "layout_data");
976         MP_CHECK_LAYOUT_DATA(layout_data);
977
978         if (layout_data->category == MP_LAYOUT_TRACK_LIST && layout_data->track_type == MP_TRACK_BY_PLAYLIST)
979                 reorder = TRUE;
980
981         mp_view_layout_set_layout_data(top_view, MP_LAYOUT_EDIT_MODE, TRUE, MP_LAYOUT_REORDER_MODE, reorder, -1);
982
983         mp_view_layout_set_edit_mode(layout_data, true);
984
985         const char *title = NULL;
986         if(mp_view_manager_count_view_content(view_data) > 1)
987                 title = _mp_edit_view_get_view_title(layout_data);
988
989         mp_view_manager_set_title_and_buttons(view_data, title, layout_data);
990         mp_common_set_toolbar_button_sensitivity(layout_data, 0);
991
992         return NULL;
993
994 }
995
996 bool
997 mp_edit_view_get_selected_track_list(void *data, GList **p_list)
998 {
999         struct appdata *ad = data;
1000         MP_CHECK_FALSE(ad);
1001
1002         Evas_Object *top_view = mp_view_manager_get_last_view_layout(ad);
1003         MP_CHECK_FALSE(top_view);
1004
1005         mp_layout_data_t *layout_data = evas_object_data_get(top_view, "layout_data");
1006         MP_CHECK_FALSE(layout_data);    /* not list layout */
1007
1008         if (layout_data->category != MP_LAYOUT_TRACK_LIST || !layout_data->edit_mode)
1009         {
1010                 mp_debug("Not track list (edit mode)");
1011                 return false;
1012         }
1013
1014         if (layout_data->checked_count > 0)
1015         {
1016                 Elm_Object_Item *gl_item = elm_genlist_first_item_get(layout_data->genlist);
1017                 char *path = NULL;
1018                 while (gl_item) {
1019                         mp_genlist_item_data_t *item = elm_object_item_data_get(gl_item);
1020                         if (item && item->checked) {
1021                                 mp_media_info_get_file_path(item->handle, &path);
1022                                 if (path) {
1023                                         *p_list = g_list_append(*p_list, path);
1024                                 }
1025                         }
1026
1027                         gl_item = elm_genlist_item_next_get(gl_item);
1028                 }
1029         }
1030
1031         return true;
1032 }
1033