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_contents.h>
21 #include <app_media.h>
24 #include <layoutmgr.h>
29 #include "data/mediadata.h"
30 #include "util/listmgr.h"
31 #include "util/util.h"
33 #define LIST_MEDIA_COND "media_type=3"
35 #define TEXT_NOCONTENT "No Music"
36 #define TEXT_NOW_PLAYING "Now Playing"
38 #define GRID_PADDING 26
39 #define GRID_ITEM_X (488 + GRID_PADDING)
40 #define GRID_ITEM_Y (134 + GRID_PADDING)
41 #define GRID_NUM_ITEM 4
43 #define BOX_PADDING (62 - GRID_PADDING)
48 Evas_Object *menu_btn;
52 struct listmgr *listmgr;
53 struct listmgr_data *ldata;
57 Eina_List *media_list;
59 app_media *playing_info;
62 static char *_grid_text_get(void *data, Evas_Object *obj, const char *part)
71 info = app_media_get_info(am);
73 _ERR("failed to get media info");
77 if (!strcmp(part, PART_ELM_TEXT_TITLE))
78 return strdup(info->title);
79 else if (!strcmp(part, PART_ELM_TEXT_ARTIST))
80 return strdup(info->audio->artist);
81 else if (!strcmp(part, PART_ELM_TEXT_ALBUM))
82 return strdup(info->audio->album);
87 static Evas_Object *_grid_content_get(void *data,
88 Evas_Object *obj, const char *part)
98 info = app_media_get_info(am);
100 _ERR("failed to get media info");
105 if (!strcmp(part, PART_ELM_SWALLOW_THUMBNAIL)) {
106 image = util_add_image(obj, info->thumbnail_path);
108 _ERR("failed to create image object");
112 evas_object_show(image);
113 } else if (!strcmp(part, PART_ELM_SWALLOW_FAVORITE)) {
117 image = util_add_image(obj, IMAGE_THUMBNAIL_FAVORITE);
119 _ERR("failed to create image object");
123 evas_object_show(image);
129 static struct grid_class _gclass = {
130 .item_style = STYLE_GRID_SONG_ITEM,
131 .text_get = _grid_text_get,
132 .content_get = _grid_content_get
135 static bool _update_playing_info(void *data, Evas_Object *base)
137 Evas_Object *content, *image;
138 app_media_info *info;
141 if (!data || !base) {
142 _ERR("invalid argument");
148 content = elm_object_part_content_get(base, PART_ITEM_CONTENT);
150 _ERR("failed to get content part");
154 image = elm_object_part_content_get(content,
155 PART_PLAYING_CONTENT_THUMBNAIL);
157 _ERR("failed to get image object");
161 info = app_media_get_info(priv->playing_info);
163 _ERR("failed to get app media info");
167 elm_image_file_set(image, info->thumbnail_path, NULL);
168 elm_image_aspect_fixed_set(image, EINA_FALSE);
170 elm_object_part_text_set(content, PART_PLAYING_CONTENT_TITLE,
173 elm_object_part_text_set(content, PART_PLAYING_CONTENT_ARTIST,
174 info->audio->artist);
175 elm_object_part_text_set(content, PART_PLAYING_CONTENT_ALBUM,
179 elm_object_signal_emit(content, SIG_PLAYING_SHOW_FAV,
182 elm_object_signal_emit(content, SIG_PLAYING_HIDE_FAV,
188 static bool _draw_playing_title(Evas_Object *base)
192 btn = elm_button_add(base);
194 _ERR("failed to create button object");
198 elm_object_style_set(btn, STYLE_BTN_INDEX);
199 elm_object_text_set(btn, TEXT_NOW_PLAYING);
201 elm_object_part_content_set(base, PART_ITEM_TITLE, btn);
206 static bool _draw_playing_content(Evas_Object *base)
208 Evas_Object *btn, *image;
210 btn = elm_button_add(base);
212 _ERR("failed to create button object");
216 elm_object_style_set(btn, STYLE_BTN_PLAYING_CONTENT);
218 image = elm_image_add(btn);
220 _ERR("failed to create image object");
224 elm_object_part_content_set(btn, PART_PLAYING_CONTENT_THUMBNAIL, image);
226 elm_object_part_content_set(base, PART_ITEM_CONTENT, btn);
231 static bool _draw_playing_info(void *data, Evas_Object *base)
234 _ERR("invalid argument");
238 if (!_draw_playing_title(base)) {
239 _ERR("failed to draw playing title");
243 if (!_draw_playing_content(base)) {
244 _ERR("failed to draw playing content");
251 static void _recent_item_selected(struct _priv *priv, app_media *am)
253 app_media_info *info;
254 struct view_update_data vdata;
256 info = app_media_get_info(am);
258 _ERR("failed to get app media info");
262 vdata.list = mediadata_get_medialist(priv->md);
263 vdata.index = util_get_media_index_from_id(vdata.list, info->media_id);
265 viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata);
266 viewmgr_push_view(VIEW_MPLAYER);
269 static void _item_selected(struct _priv *priv, app_media *am)
271 struct view_update_data vdata;
273 vdata.list = mediadata_get_medialist(priv->md);
274 vdata.index = util_get_media_index(vdata.list, am);
276 viewmgr_update_view(VIEW_MPLAYER, UPDATE_CONTENT, &vdata);
277 viewmgr_push_view(VIEW_MPLAYER);
280 static void _playing_selected_cb(void *data, Evas_Object *obj)
289 _item_selected(priv, priv->playing_info);
292 static void _grid_selected_cb(void *data, Elm_Object_Item *it)
298 _ERR("invalid argument");
304 am = elm_object_item_data_get(it);
306 _ERR("failed to get app media");
310 _item_selected(priv, am);
313 static void _grid_key_down_cb(void *data, Elm_Object_Item *it,
314 Evas_Event_Key_Down *ev)
317 struct view_update_data vdata;
321 _ERR("invalid argument");
327 if (!strcmp(ev->keyname, KEY_MENU) ||
328 !strcmp(ev->keyname, KEY_MENU_REMOTE)) {
329 am = elm_object_item_data_get(it);
331 _ERR("failed to get app media");
335 vdata.list = mediadata_get_medialist(priv->md);
336 vdata.index = util_get_media_index(vdata.list, am);
338 viewmgr_update_view(VIEW_ACTION_MENU, UPDATE_CONTENT, &vdata);
339 viewmgr_show_view(VIEW_ACTION_MENU);
343 static struct listmgr_data *_create_listmgr_data(struct _priv *priv)
345 struct listmgr_data *data;
346 struct play_info_ops *pops;
347 struct grid_ops *gops;
349 data = calloc(1, sizeof(*data));
353 data->menu_btn = priv->menu_btn;
355 data->grid_item_x = GRID_ITEM_X;
356 data->grid_item_y = GRID_ITEM_Y;
357 data->grid_num_item = GRID_NUM_ITEM;
358 data->box_padding = BOX_PADDING;
360 pops = calloc(1, sizeof(*pops));
364 pops->draw = _draw_playing_info;
365 pops->update = _update_playing_info;
366 pops->selected_cb = _playing_selected_cb;
367 pops->ops_data = priv;
369 gops = calloc(1, sizeof(*gops));
373 gops->gclass = &_gclass;
374 gops->key_down_cb = _grid_key_down_cb;
375 gops->selected_cb = _grid_selected_cb;
376 gops->ops_data = priv;
388 _ERR("failed to allocate memory");
392 static void _update_content_info(struct _priv *priv)
397 count = mediadata_get_media_count(priv->md, E_MEDIA_MUSIC);
399 _ERR("failed to get media count");
403 snprintf(buf, sizeof(buf), "%d Songs", count);
405 elm_object_part_text_set(priv->layout, PART_CONTENT_INFO, buf);
408 static void _update_content_list(struct _priv *priv)
412 if (priv->media_list)
415 list = mediadata_get_list(priv->md, E_LIST_NAME);
417 elm_object_part_text_set(priv->layout,
418 PART_NOCONTENT, TEXT_NOCONTENT);
422 if (!listmgr_update_content_list(priv->listmgr, list))
423 _ERR("failed to update list area");
425 priv->media_list = list;
427 _update_content_info(priv);
430 static app_media *_get_playing_item(Eina_List *list)
434 struct recent_data *rdata;
439 r = app_contents_get_recent_list(CONTENTS_MUSIC, 1, &rlist);
440 if (r != APP_CONTENTS_ERROR_NONE) {
441 _ERR("failed to get movie recent list");
445 rdata = g_list_nth_data(rlist, 0);
446 if (rdata && rdata->id)
447 am = util_find_media_info(list, rdata->id);
449 app_contents_free_recent_list(rlist);
454 static void _update_playing_item(struct _priv *priv, const char *id)
458 app_media_info *info;
460 list = mediadata_get_medialist(priv->md);
462 am = util_find_media_info(list, id);
464 am = _get_playing_item(list);
467 _ERR("failed to get app media");
471 info = app_media_get_info(am);
473 _ERR("failed to get app media info");
477 priv->playing_info = am;
479 if (!listmgr_update_play_info(priv->listmgr, info))
480 _ERR("failed to update now playing item");
483 static bool _create(layoutmgr *lmgr, void *data)
485 struct listmgr *listmgr;
486 struct listmgr_data *ldata;
487 struct mediadata *md;
489 Evas_Object *base, *layout;
492 _ERR("failed to get layoutmgr");
497 _ERR("invalid argument");
501 priv = calloc(1, sizeof(*priv));
503 _ERR("failed to allocate priv");
507 priv->menu_btn = (Evas_Object *)data;
509 base = layoutmgr_get_base(lmgr);
511 _ERR("failed to get base object");
515 layout = elm_layout_add(base);
517 _ERR("failed to create layout");
521 if (!elm_layout_file_set(layout, EDJEFILE, GRP_MUSIC_LAYOUT)) {
522 _ERR("failed to set layout file");
526 ldata = _create_listmgr_data(priv);
528 _ERR("failed to create listmgr data");
532 listmgr = listmgr_create(layout, (void *)ldata);
534 _ERR("failed to create listmgr");
538 md = mediadata_create(LIST_MEDIA_COND, E_SOURCE_ALL, E_SORT_NAME);
540 _ERR("failed to create mediadata");
541 listmgr_destroy(listmgr);
546 priv->layout = layout;
548 priv->listmgr = listmgr;
552 layoutmgr_set_layout_data(lmgr, LAYOUT_MUSIC, priv);
554 if (!listmgr_draw_list_area(listmgr)) {
555 _ERR("failed to draw list area");
556 mediadata_destroy(md);
557 listmgr_destroy(listmgr);
566 evas_object_del(layout);
572 static void _destroy(void *layout_data)
577 _ERR("failed to get layout data");
583 mediadata_free_list(priv->media_list);
584 mediadata_destroy(priv->md);
586 listmgr_destroy(priv->listmgr);
587 free(priv->ldata->gops);
590 evas_object_del(priv->layout);
595 static void _show(void *layout_data)
600 _ERR("failed to layout data");
606 evas_object_show(priv->layout);
607 elm_object_part_content_set(priv->base,
608 PART_THUMBNAIL_AREA, priv->layout);
611 static void _hide(void *layout_data)
616 _ERR("failed to get layout data");
622 evas_object_hide(priv->layout);
623 elm_object_part_content_unset(priv->base, PART_THUMBNAIL_AREA);
626 static void _update(void *layout_data, int update_type, void *data)
628 struct view_update_data *vdata;
632 _ERR("failed to get layout data");
638 switch (update_type) {
640 _update_content_list(priv);
641 _update_playing_item(priv, NULL);
643 case UPDATE_CONTENT_ITEM:
644 listmgr_update_content_item(priv->listmgr);
645 _update_playing_item(priv, NULL);
647 case UPDATE_PLAY_INFO:
649 _ERR("invalid argument");
655 _update_playing_item(priv, vdata->id);
658 listmgr_focus_play_info(priv->listmgr);
662 _ERR("invalid argument");
666 _update_content_list(priv);
667 _recent_item_selected(priv, data);
669 case UPDATE_FOCUS_STATE:
670 listmgr_set_focus_state(priv->listmgr, EINA_FALSE);
677 static layout_class _lclass = {
678 .layout_id = LAYOUT_MUSIC,
686 layout_class *layout_music_get_lclass(void)