2 * Copyright 2012 Samsung Electronics Co., Ltd
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
8 * http://www.tizenopensource.org/license
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.
18 #include "ge-albums.h"
19 #include "ge-gridview.h"
20 #include "ge-ui-util.h"
24 #include "ge-strings.h"
26 #include "ge-rotate-bg.h"
28 static Elm_Gengrid_Item_Class album_gic;
29 static Elm_Gengrid_Item_Class album_gic_blue;
30 static int gl_albums_item_cnt;
31 static ge_item* gl_album_items[GE_ALBUM_COVER_THUMB_NUM];
32 static int gl_album_count;
34 static void _ge_albums_drag_up(void *data, Evas_Object *obj, void *event_info)
39 static void _ge_albums_drag_right(void *data, Evas_Object *obj, void *event_info)
44 static void _ge_albums_drag_down(void *data, Evas_Object *obj, void *event_info)
49 static void _ge_albums_drag_left(void *data, Evas_Object *obj, void *event_info)
54 static void _ge_albums_drag_stop(void *data, Evas_Object *obj, void *event_info)
59 static void _ge_albums_realized(void *data, Evas_Object *obj, void *event_info)
64 static void _ge_albums_selected(void *data, Evas_Object *obj, void *event_info)
69 static void _ge_albums_unselected(void *data, Evas_Object *obj, void *event_info)
74 static void _ge_albums_clicked(void *data, Evas_Object *obj, void *event_info)
79 static void _ge_albums_longpress(void *data, Evas_Object *obj, void *event_info)
84 static Eina_Bool _ge_albums_append_grid_idler(void *data)
86 GE_CHECK_CANCEL(data);
87 ge_ugdata* ugd = (ge_ugdata*)data;
89 /* Try to get other medias from DB and append them to gridview*/
90 int ret = ge_grid_idler_append_thumbs(data);
92 ge_dbg("Failed to append grid items!");
94 ge_dbg("Successful to append grid items!");
97 /* Remove idler after all items appended */
98 GE_IF_DEL_IDLER(ugd->grid_append_idler)
100 return ECORE_CALLBACK_CANCEL;
103 static void __ge_albums_sel_cb(void *data, Evas_Object *obj, void *event_info)
106 GE_CHECK(event_info);
107 Evas_Event_Mouse_Up *ev = event_info;
109 if (ev->event_flags & EVAS_EVENT_FLAG_ON_HOLD)
113 ge_cluster *album_item = (ge_cluster*)data;
114 GE_CHECK(album_item->cluster);
115 GE_CHECK(album_item->ugd);
116 ge_ugdata *ugd = album_item->ugd;
117 if(ugd->ug == NULL) {
118 ge_dbg("UG already destroyed, return!");
122 if (album_item->cluster->count == 0) {
123 ge_dbgW("Empty album, return;");
127 ge_albums_sel_album(album_item);
130 static char *__ge_albums_get_text(void *data, Evas_Object *obj, const char *part)
134 ge_cluster *album_item = (ge_cluster *)data;
135 GE_CHECK_NULL(album_item->cluster);
136 GE_CHECK_NULL(album_item->cluster->uuid);
137 GE_CHECK_NULL(album_item->ugd);
138 ge_ugdata *ugd = album_item->ugd;
139 char buf[GE_FILE_PATH_LEN_MAX] = {0,};
141 if (!g_strcmp0(part, "elm.text.name"))
143 GE_CHECK_NULL(album_item->cluster->display_name);
144 if(_ge_data_is_root_path(album_item->cluster->path)) {
145 snprintf(buf, sizeof(buf), "%s", GE_ALBUM_ROOT_NAME);
146 buf[strlen(buf)] = '\0';
147 } else if(strlen(album_item->cluster->display_name)) {
148 snprintf(buf, sizeof(buf), "%s", (char*)(album_item->cluster->display_name));
149 buf[strlen(buf)] = '\0';
152 /* Show blue folder name */
153 if (!g_strcmp0(album_item->cluster->uuid, GE_ALBUM_ALL_ID) ||
154 _ge_data_is_default_album(GE_ALBUM_MY_NAME, album_item->cluster)) {
155 Elm_Object_Item *grid_it = album_item->griditem;
156 Evas_Object *it_obj = NULL;
157 it_obj = elm_object_item_widget_get(grid_it);
158 GE_CHECK_NULL(it_obj);
159 edje_object_signal_emit(it_obj, "elm,name,show,blue",
161 edje_object_message_signal_process(it_obj);
164 else if (!g_strcmp0(part, "elm.text.date"))
168 char date1[GE_ALBUM_DATE_LEN_MAX] = {0,};
169 char date2[GE_ALBUM_DATE_LEN_MAX] = {0,};
170 char date3[GE_ALBUM_DATE_LEN_MAX] = {0,};
172 ge_albums_free_cover_thumbs(ugd);
174 int item_count = GE_ALBUM_COVER_THUMB_NUM;
175 ge_item** items1 = gl_album_items;
177 _ge_data_get_first_several_items(ugd, album_item, items1,
179 MEDIA_CONTENT_ORDER_DESC);
186 gl_album_count = item_count;
187 if(items1[0] == NULL || items1[0]->item == NULL)
192 memcpy(&album_item->item_mtime, &(items1[0]->item->mtime), sizeof(time_t));
196 memset(items2, 0x00, item_count * sizeof(int));
197 _ge_data_get_first_several_items(ugd, album_item, items2,
199 MEDIA_CONTENT_ORDER_ASC);
207 memset(&t1, 0x00, sizeof(struct tm));
208 localtime_r((time_t *) &(album_item->item_mtime), &t1);
209 strftime(date1, sizeof(date1), "%Y.%m.%d", &t1);
210 strftime(date3, sizeof(date3), "%Y.%m", &t1);
212 if(items2[0] == NULL || items2[0]->item == NULL)
217 memset(&t2, 0x00, sizeof(struct tm));
218 localtime_r((time_t *) &(items2[0]->item->mtime), &t2);
219 strftime(date2, sizeof(date2), "%Y.%m.%d", &t2);
221 if(!g_strcmp0(date1, date2))
223 g_strlcpy(buf, date1, sizeof(buf));
227 strftime(date2, sizeof(date2), "%Y.%m", &t2);
228 snprintf(buf, sizeof(buf), "%s - %s", date2, date3);
229 buf[strlen(buf)] = '\0';
234 for(i = 0; i < item_count; i++)
236 _ge_data_destroy_item(items2[i]);
240 else if (!g_strcmp0(part, "elm.text.count"))
242 _ge_data_update_items_cnt(ugd, album_item);
243 snprintf(buf, sizeof(buf), "%d", (int)(album_item->cluster->count));
244 buf[strlen(buf)] = '\0';
250 static ge_icon_type __ge_albums_set_bg_file(Evas_Object *bg, void *data)
252 ge_item *git = (ge_item *)data;
253 char *bg_path = GE_DEFAULT_THUMB_ICON;
254 ge_icon_type ret_val = GE_ICON_CORRUPTED_FILE;
256 if (git == NULL || git->item == NULL) {
257 ge_dbgE("Invalid item :%p", git);
258 goto GE_ALBUMS_FAILED;
261 /* Is it DRM file? Has a valid RO? */
262 char *path = git->item->file_url;
263 if(ge_drm_is_drm_file(path) &&
264 !ge_drm_check_valid_ro(path, ge_drm_get_permtype(git->item->type))) {
265 ret_val = GE_ICON_EXPIRED_DRM;
266 goto GE_ALBUMS_FAILED;
269 ret_val= GE_ICON_NORMAL;
270 bg_path = _GETICON(git->item->thumb_url);
274 #ifdef _USE_ROTATE_BG_GE
275 _ge_rotate_bg_set_image_file(bg, bg_path);
277 elm_bg_file_set(bg, bg_path, NULL);
283 static Evas_Object *__ge_albums_get_content(void *data, Evas_Object *obj, const char *part)
286 GE_CHECK_NULL(strlen(part));
288 ge_cluster *album_item = (ge_cluster *)data;
289 GE_CHECK_NULL(album_item->cluster);
290 GE_CHECK_NULL(album_item->ugd);
291 ge_ugdata *ugd = album_item->ugd;
293 GE_CHECK_NULL(album_item->cluster->uuid);
294 const char *al_id = album_item->cluster->uuid;
297 Evas_Object *_obj = NULL;
298 if ((!g_strcmp0(part, GT_TILE_FIRSTICON)) ||
299 (!g_strcmp0(part, GT_TILE_ONLYICON)) ||
300 (!g_strcmp0(part, GT_TILE_ICON))
301 #ifdef _USE_ROTATE_BG_GE
302 || (!g_strcmp0(part, GT_TILE_3ICON1)) ||
303 (!g_strcmp0(part, GT_TILE_3ICON2)) ||
304 (!g_strcmp0(part, GT_TILE_4ICON3)) ||
305 (!g_strcmp0(part, GT_TILE_4ICON4)) ||
306 (!g_strcmp0(part, GT_TILE_5ICON1)) ||
307 (!g_strcmp0(part, GT_TILE_5ICON2)) ||
308 (!g_strcmp0(part, GT_TILE_6ICON4)) ||
309 (!g_strcmp0(part, GT_TILE_6ICON5))
312 _obj = _ge_tile_show_part_icon(obj, part, gl_album_count,
314 __ge_albums_set_bg_file,
315 (void **)gl_album_items);
316 } else if (!g_strcmp0(part, GT_TILE_LABEL)) {
318 * for "Camera", its color should be
319 * 25:25:25 by new gui
321 bool b_default = false;
322 if (!g_strcmp0(al_id, GE_ALBUM_ALL_ID) ||
323 _ge_data_is_default_album(GE_ALBUM_MY_NAME, album_item->cluster))
325 _obj = _ge_tile_show_part_label(obj, album_item->index,
328 if (album_item->cluster->count <= 0)
329 ge_dbg("Empty album");
334 static int _ge_albums_create_album(ge_ugdata* ugd, Evas_Object* parent)
337 GE_CHECK_VAL(parent, -1);
338 GE_CHECK_VAL(ugd, -1);
339 GE_CHECK_VAL(ugd->cluster_list, -1);
342 ge_cluster *album_item = NULL;
344 album_gic.item_style = "albums_view";
345 album_gic.func.text_get = __ge_albums_get_text;
346 album_gic.func.content_get = __ge_albums_get_content;
348 album_gic_blue.item_style = "albums_view_blue";
349 album_gic_blue.func.text_get = __ge_albums_get_text;
350 album_gic_blue.func.content_get = __ge_albums_get_content;
353 int length = eina_list_count(ugd->cluster_list->clist);
354 ge_dbg("Albums list length: %d.", length);
356 elm_gengrid_clear(parent);
360 elm_object_theme_set(parent, ugd->th);
362 elm_object_style_set(parent, "gallery_efl/default");
364 for(i = 0; i < length; i++)
366 album_item = eina_list_nth(ugd->cluster_list->clist, i);
367 GE_CHECK_VAL(album_item, -1);
368 GE_CHECK_VAL(album_item->cluster, -1);
369 GE_CHECK_VAL(album_item->cluster->display_name, -1);
371 /* Show blue folder name */
372 if (!g_strcmp0(album_item->cluster->uuid, GE_ALBUM_ALL_ID) ||
373 _ge_data_is_default_album(GE_ALBUM_MY_NAME, album_item->cluster))
374 album_item->griditem = elm_gengrid_item_append(parent,
380 album_item->griditem = elm_gengrid_item_append(parent,
385 album_item->index = grid_cnt;
387 ge_dbg("Append [%s], id=%s.", album_item->cluster->display_name,
388 album_item->cluster->uuid);
391 gl_albums_item_cnt = grid_cnt;
399 ge_dbgW("None albums appended to view!");
404 int ge_albums_free_cover_thumbs(ge_ugdata *ugd)
406 GE_CHECK_VAL(ugd, -1);
409 for(i = 0; i < GE_ALBUM_COVER_THUMB_NUM; i++)
411 if(gl_album_items[i])
413 _ge_data_destroy_item(gl_album_items[i]);
414 gl_album_items[i] = NULL;
421 int ge_albums_back_to_view(ge_ugdata *ugd)
424 GE_CHECK_VAL(ugd, -1);
426 if(ugd->file_select_mode == GE_File_Select_Multiple)
428 ge_ui_destroy_selinfo(ugd);
429 _ge_data_selected_list_finalize();
432 GE_IF_DEL_IDLER(ugd->grid_append_idler)
434 ge_albums_update_view(ugd);
435 ge_grid_clear_view(ugd);
437 _ge_set_view_mode(GE_AlbumsView_Mode);
441 int ge_albums_sel_album(ge_cluster* album_item)
444 GE_CHECK_VAL(album_item, -1);
445 GE_CHECK_VAL(album_item->cluster, -1);
446 GE_CHECK_VAL(album_item->cluster->uuid, -1);
447 GE_CHECK_VAL(album_item->ugd, -1);
449 if(_ge_get_view_mode() != GE_AlbumsView_Mode)
451 ge_dbgE("error mode.. now return!");
459 ge_ugdata *ugd = album_item->ugd;
460 GE_CHECK_VAL(ugd->cluster_list, -1);
461 GE_CHECK_VAL(ugd->navi_bar, -1);
462 ge_dbg("Album: %s, id: %s.", album_item->cluster->display_name,
463 album_item->cluster->uuid);
465 if(ugd->album_select_mode == GE_Album_Select_One)
467 ge_dbg("One album selected, return album id and destroy the ug!");
469 char folder_path[GE_DIR_PATH_LEN_MAX] = { 0, };
470 g_strlcpy(folder_path, album_item->cluster->path,
471 GE_DIR_PATH_LEN_MAX);
472 service_add_extra_data(ugd->service,
473 GE_ALBUM_SELECT_RETURN_PATH,
475 ge_dbg("return folder-path: %s", folder_path);
476 ug_send_result(ugd->ug, ugd->service);
477 ug_destroy_me(ugd->ug);
482 /* Set current album */
483 _ge_set_current_album(album_item);
485 GE_IF_DEL_IDLER(ugd->grid_append_idler)
486 /* Get album contents from DB */
487 _ge_data_get_items_list(ugd, album_item, GE_FIRST_VIEW_START_POS,
488 GE_FIRST_VIEW_END_POS);
490 if(ugd->file_select_mode == GE_File_Select_Setas)
492 ge_dbg("setas mode->thumbnail is view mode");
493 _ge_set_view_mode(GE_ThumbnailView_Mode);
497 ge_dbg("select mode->thumbnail is edit mode");
498 _ge_set_view_mode(GE_ThumbnailEdit_Mode);
501 ugd->thumbs_view_ly = ge_grid_create_ly(ugd->navi_bar);
502 GE_CHECK_VAL(ugd->thumbs_view_ly, -1);
503 Evas_Object* gv = NULL;
505 gv = ge_grid_create_view(ugd, ugd->thumbs_view_ly);
506 GE_CHECK_VAL(gv, -1);
508 elm_object_part_content_set(ugd->thumbs_view_ly, "contents", gv);
509 ugd->thumbs_view = gv;
510 if(gv == ugd->nocontents)
512 ugd->thumbs_nocontents = gv;
515 /* Checkme: clear albums view for animation effect pause issue */
516 elm_gengrid_clear(ugd->albums_view);
518 if(_ge_get_view_mode() == GE_ThumbnailView_Mode)
520 /* Check root case */
521 if(_ge_data_is_root_path(album_item->cluster->path))
523 ge_ui_create_title_and_push(ugd, ugd->navi_bar,
524 ugd->thumbs_view_ly, ThumbnailView_Title, GE_ALBUM_ROOT_NAME);
528 ge_ui_create_title_and_push(ugd, ugd->navi_bar,
529 ugd->thumbs_view_ly, ThumbnailView_Title, album_item->cluster->display_name);
534 ge_ui_create_title_and_push(ugd, ugd->navi_bar,
535 ugd->thumbs_view_ly, ThumbnailView_Title, ugd->albums_view_title);
538 if(_ge_data_get_count_all() == (GE_FIRST_VIEW_END_POS+1))
540 ge_dbg("\n\n>>>>>>>>Use idler to append other medias--Start>>>>>>>>\n");
541 ugd->grid_append_idler = ecore_idler_add(_ge_albums_append_grid_idler, ugd);
544 ge_dbg("Done ge_albums_sel_album");
548 Evas_Object* ge_albums_create_ly(Evas_Object* parent)
551 GE_CHECK_NULL(parent);
552 Evas_Object* layout = ge_ui_load_edj(parent, GE_EDJ_FILE, GE_GRP_ALBUMVIEW);
553 GE_CHECK_NULL(layout);
554 evas_object_show (layout);
559 int ge_albums_del_callbacks(ge_ugdata* ugd)
561 GE_CHECK_VAL(ugd, -1);
564 ge_dbg("Delete albums callbacks!");
565 evas_object_smart_callback_del(ugd->albums_view, "selected", _ge_albums_selected);
566 evas_object_smart_callback_del(ugd->albums_view, "unselected", _ge_albums_unselected);
567 evas_object_smart_callback_del(ugd->albums_view, "clicked", _ge_albums_clicked);
568 evas_object_smart_callback_del(ugd->albums_view, "longpressed", _ge_albums_longpress);
569 evas_object_smart_callback_del(ugd->albums_view, "drag,start,up", _ge_albums_drag_up);
570 evas_object_smart_callback_del(ugd->albums_view, "drag,start,right", _ge_albums_drag_right);
571 evas_object_smart_callback_del(ugd->albums_view, "drag,start,down", _ge_albums_drag_down);
572 evas_object_smart_callback_del(ugd->albums_view, "drag,start,left", _ge_albums_drag_left);
573 evas_object_smart_callback_del(ugd->albums_view, "drag,stop", _ge_albums_drag_stop);
574 evas_object_smart_callback_del(ugd->albums_view, "realized", _ge_albums_realized);
579 Evas_Object* ge_albums_create_view(ge_ugdata* ugd, Evas_Object* parent)
582 GE_CHECK_NULL(parent);
584 GE_CHECK_NULL(ugd->cluster_list);
586 memset(gl_album_items, 0x00, GE_ALBUM_COVER_THUMB_NUM * sizeof(int));
589 if(!ugd->cluster_list->clist ||
590 (eina_list_count(ugd->cluster_list->clist) == 0)) {
591 ge_dbgW("Clusters list is empty!");
595 double scale_factor = ugd->win_scale;
596 ge_dbg("Own scale facotr: %f, elm_config_scale_get =%f.", scale_factor, elm_config_scale_get());
598 Evas_Object *grid = elm_gengrid_add(parent);
600 elm_gengrid_item_size_set(grid,
601 (int)(GE_ALBUM_ITEM_WIDTH * scale_factor),
602 (int)(GE_ALBUM_ITEM_HEIGHT * scale_factor));
603 elm_gengrid_align_set(grid, 0.5, 0.0);
604 elm_gengrid_horizontal_set(grid, EINA_FALSE);
605 elm_gengrid_bounce_set(grid, EINA_FALSE, EINA_TRUE);
606 elm_gengrid_multi_select_set(grid, EINA_TRUE);
607 evas_object_size_hint_weight_set(grid, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
609 if(_ge_albums_create_album(ugd, grid) != 0)
611 ge_dbgW("Failed to append album items!");
612 evas_object_del(grid);
619 evas_object_show (grid);
622 evas_object_smart_callback_add(grid, "selected", _ge_albums_selected, NULL);
623 evas_object_smart_callback_add(grid, "unselected", _ge_albums_unselected, NULL);
624 evas_object_smart_callback_add(grid, "clicked", _ge_albums_clicked, NULL);
625 evas_object_smart_callback_add(grid, "longpressed", _ge_albums_longpress, NULL);
626 evas_object_smart_callback_add(grid, "drag,start,up", _ge_albums_drag_up, NULL);
627 evas_object_smart_callback_add(grid, "drag,start,right", _ge_albums_drag_right, NULL);
628 evas_object_smart_callback_add(grid, "drag,start,down", _ge_albums_drag_down, NULL);
629 evas_object_smart_callback_add(grid, "drag,start,left", _ge_albums_drag_left, NULL);
630 evas_object_smart_callback_add(grid, "drag,stop", _ge_albums_drag_stop, NULL);
631 evas_object_smart_callback_add(grid, "realized", _ge_albums_realized, NULL);
636 /* Show no contents if none albums exist */
637 ge_dbgW("@@@@@@@ To create nocontents view @@@@@@@@");
638 ugd->nocontents = ge_ui_create_nocontents(ugd);
639 ugd->albums_view = ugd->nocontents;
640 evas_object_show(ugd->nocontents);
642 return ugd->nocontents;
645 int ge_albums_update_view(ge_ugdata *ugd)
648 GE_CHECK_VAL(ugd, -1);
649 GE_CHECK_VAL(ugd->cluster_list, -1);
650 /* Changed to show no contents if needed */
651 if(!ugd->cluster_list->clist ||
652 (eina_list_count(ugd->cluster_list->clist) == 0)) {
653 ge_dbgW("Clusters list is empty!");
657 if(ugd->nocontents && ugd->nocontents == ugd->albums_view) {
658 /* It is nocontents, unset it first then create albums view*/
659 evas_object_del(ugd->nocontents);
660 ugd->nocontents = NULL;
662 ugd->albums_view = ge_albums_create_view(ugd, ugd->navi_bar);
663 GE_CHECK_VAL(ugd->albums_view, -1);
664 elm_object_part_content_set(ugd->albums_view_ly, "contents",
666 evas_object_show(ugd->albums_view);
668 if(_ge_albums_create_album(ugd, ugd->albums_view) != 0)
676 if(ugd->albums_view && ugd->albums_view != ugd->nocontents)
677 ge_albums_del_callbacks(ugd);
679 evas_object_del(ugd->albums_view);
681 ge_dbgW("@@@@@@@ To create nocontents view @@@@@@@@");
682 ugd->nocontents = ge_ui_create_nocontents(ugd);
683 ugd->albums_view = ugd->nocontents;
684 GE_CHECK_VAL(ugd->albums_view, -1);
685 evas_object_show(ugd->albums_view);
687 elm_object_part_content_set(ugd->albums_view_ly, "contents",