2 * Copyright (c) 2015 Samsung Electronics Co., Ltd All Rights Reserved
4 * Licensed under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
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.
17 #include <Elementary.h>
18 #include <media_content.h>
19 #include <app_debug.h>
20 #include <app_media.h>
22 #include <layoutmgr.h>
27 #include "data/mediadata.h"
28 #include "util/listmgr.h"
29 #include "util/util.h"
33 #define LIST_MEDIA_COND "media_type=0 OR \
34 (media_type=1 AND copyright LIKE \"Unknown\")"
36 #define LIST_MEDIA_COND "(media_type=0 OR media_type=1) AND copyright LIKE \"Unknown\""
38 #define TEXT_NOCONTENT "No Photo & Video"
40 #define GRID_PADDING 6
41 #define GRID_ITEM_X (200 + GRID_PADDING)
42 #define GRID_ITEM_Y (200 + GRID_PADDING)
43 #define GRID_NUM_ITEM 3
45 #define BOX_PADDING (62 - GRID_PADDING)
47 #define IMAGE_FAVORITE_ALPHA 150
52 Evas_Object *menu_btn;
56 struct listmgr *listmgr;
57 struct listmgr_data *ldata;
62 Eina_List *media_list;
65 static char *_grid_text_get(void *data, Evas_Object *obj, const char *part)
75 info = app_media_get_info(am);
77 _ERR("failed to get media info");
81 if (info->media_type != MEDIA_CONTENT_TYPE_VIDEO)
84 if (!strcmp(part, PART_ELM_TEXT_PLAYTIME)) {
85 util_time_string(buf, sizeof(buf),
86 info->video->duration, false);
94 static Evas_Object *_grid_content_get(void *data,
95 Evas_Object *obj, const char *part)
105 info = app_media_get_info(am);
107 _ERR("failed to get media info");
112 if (!strcmp(part, PART_ELM_SWALLOW_THUMBNAIL)) {
113 image = util_add_image(obj, info->thumbnail_path);
115 _ERR("failed to create image object");
119 evas_object_show(image);
120 } else if (!strcmp(part, PART_ELM_SWALLOW_VIDEO)) {
121 if (info->media_type == MEDIA_CONTENT_TYPE_VIDEO) {
122 image = util_add_image(obj, IMAGE_THUMBNAIL_PLAY);
124 _ERR("failed to create image object");
128 evas_object_show(image);
130 } else if (!strcmp(part, PART_ELM_SWALLOW_FAVORITE)) {
136 image = util_add_image(obj, IMAGE_THUMBNAIL_FAVORITE);
138 _ERR("failed to create image object");
142 evas_object_color_get(image, &r, &g, &b, &a);
143 evas_object_color_set(image, r, g, b, IMAGE_FAVORITE_ALPHA);
145 evas_object_show(image);
151 static struct grid_class _gclass = {
152 .item_style = STYLE_GRID_GALLERY_ITEM,
153 .text_get = _grid_text_get,
154 .content_get = _grid_content_get
157 static void _grid_selected_cb(void *data, Elm_Object_Item *it)
160 struct view_update_data vdata;
164 _ERR("invalid argument");
170 am = elm_object_item_data_get(it);
172 _ERR("failed to get app media");
176 vdata.list = mediadata_get_medialist(priv->md);
177 vdata.index = util_get_media_index(vdata.list, am);
178 priv->cur_index = vdata.index;
180 viewmgr_update_view(VIEW_VIEWER, UPDATE_CONTENT, &vdata);
181 viewmgr_push_view(VIEW_VIEWER);
184 static struct listmgr_data *_create_listmgr_data(struct _priv *priv)
186 struct listmgr_data *data;
187 struct grid_ops *gops;
189 data = calloc(1, sizeof(*data));
193 data->menu_btn = priv->menu_btn;
195 data->grid_item_x = GRID_ITEM_X;
196 data->grid_item_y = GRID_ITEM_Y;
197 data->grid_num_item = GRID_NUM_ITEM;
198 data->box_padding = BOX_PADDING;
200 gops = calloc(1, sizeof(*gops));
204 gops->gclass = &_gclass;
205 gops->selected_cb = _grid_selected_cb;
206 gops->ops_data = priv;
213 _ERR("failed to allocate memory");
217 static void _update_content_info(struct _priv *priv)
222 photo = mediadata_get_media_count(priv->md, E_MEDIA_PHOTO);
223 video = mediadata_get_media_count(priv->md, E_MEDIA_VIDEO);
225 if (photo < 0 || video < 0) {
226 _ERR("failed to get media count");
230 snprintf(buf, sizeof(buf), "%d Photos, %d Videos", photo, video);
232 elm_object_part_text_set(priv->layout, PART_CONTENT_INFO, buf);
235 static void _update_content_list(struct _priv *priv)
239 if (priv->media_list)
242 list = mediadata_get_list(priv->md, E_LIST_DATE);
244 elm_object_part_text_set(priv->layout,
245 PART_NOCONTENT, TEXT_NOCONTENT);
249 if (!listmgr_update_content_list(priv->listmgr, list))
250 _ERR("failed to update list area");
252 priv->media_list = list;
254 _update_content_info(priv);
257 static bool _create(layoutmgr *lmgr, void *data)
259 struct listmgr *listmgr;
260 struct listmgr_data *ldata;
261 struct mediadata *md;
263 Evas_Object *base, *layout;
266 _ERR("failed to get layoutmgr");
271 _ERR("invalid argument");
275 priv = calloc(1, sizeof(*priv));
277 _ERR("failed to allocate priv");
281 priv->menu_btn = (Evas_Object *)data;
283 base = layoutmgr_get_base(lmgr);
285 _ERR("failed to get base object");
289 layout = elm_layout_add(base);
291 _ERR("failed to create layout");
295 if (!elm_layout_file_set(layout, EDJEFILE, GRP_GALLERY_LAYOUT)) {
296 _ERR("failed to set layout file");
300 ldata = _create_listmgr_data(priv);
302 _ERR("failed to create listmgr data");
306 listmgr = listmgr_create(layout, (void *)ldata);
308 _ERR("failed to create listmgr");
312 md = mediadata_create(LIST_MEDIA_COND, E_SOURCE_ALL, E_SORT_DATE);
314 _ERR("failed to create mediadata");
315 listmgr_destroy(listmgr);
320 priv->layout = layout;
322 priv->listmgr = listmgr;
326 layoutmgr_set_layout_data(lmgr, LAYOUT_GALLERY, priv);
328 if (!listmgr_draw_list_area(listmgr)) {
329 _ERR("failed to draw list area");
330 mediadata_destroy(md);
331 listmgr_destroy(listmgr);
340 evas_object_del(layout);
346 static void _destroy(void *layout_data)
351 _ERR("failed to get layout data");
357 mediadata_free_list(priv->media_list);
358 mediadata_destroy(priv->md);
360 listmgr_destroy(priv->listmgr);
361 free(priv->ldata->gops);
364 evas_object_del(priv->layout);
369 static void _show(void *layout_data)
374 _ERR("failed to layout data");
380 evas_object_show(priv->layout);
381 elm_object_part_content_set(priv->base,
382 PART_THUMBNAIL_AREA, priv->layout);
385 static void _hide(void *layout_data)
390 _ERR("failed to get layout data");
396 evas_object_hide(priv->layout);
397 elm_object_part_content_unset(priv->base, PART_THUMBNAIL_AREA);
400 static void _update(void *layout_data, int update_type, void *data)
402 struct view_update_data *vdata;
407 _ERR("failed to get layout data");
414 switch (update_type) {
416 _update_content_list(priv);
420 _ERR("invalid argument");
424 if (priv->cur_index != vdata->index)
429 listmgr_focus_content_list(priv->listmgr, vdata->index, update);
437 static layout_class _lclass = {
438 .layout_id = LAYOUT_GALLERY,
446 layout_class *layout_gallery_get_lclass(void)