2 * Copyright (c) 2014 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>
20 #include "AppCommon.h"
24 #include "song_info.h"
25 #include "album_info.h"
26 #include "music-controller.h"
27 #include "LayoutMgr.h"
29 #include "common-ui.h"
31 #include "ExtBaseLayout.h"
33 #include "InputHandler.h"
34 #include "album-songs-layout.h"
35 #include "base-view.h"
37 #define TOTAL_ADD_BTNS 3
43 ALBUM_SONGS_PLAY_BUTTON,
44 ALBUM_SONGS_NEXT_BUTTON,
45 ALBUM_SONGS_LAST_BUTTON,
54 struct SAlbumSongsItemInfo {
56 Elm_Object_Item *item;
59 struct SAlbumSongsLayout {
62 Evas_Object *songlist;
63 Elm_Object_Item *focused_item;
65 CMusicController* mhandle;
68 SContentInfo *ctxtinfo;
70 Eina_List *it_infolist;
71 Elm_Genlist_Item_Class *item_class;
73 CAlbumSongsLayout *parent;
76 memset(this, 0, sizeof(SAlbumSongsLayout));
79 ~SAlbumSongsLayout() {
93 char *CAlbumSongsLayout::sm_CbGetListItemText(void *data, Evas_Object *obj, const char *part)
95 SAlbumSongsItemInfo *itinfo = (SAlbumSongsItemInfo *)data;
96 CSongInfo *sinfo = NULL;
105 sinfo = itinfo->sinfo;
107 snprintf(buf, sizeof(buf), "%s", MUSIC_STR_EMPTY);
109 if (!strcmp(part, "elm.text")) {
110 index = elm_genlist_item_index_get(itinfo->item);
111 if ((index & 1) == 1) {
112 elm_object_item_signal_emit(itinfo->item,
113 MUSIC_SIGNAL_EVEN_ROW, MUSIC_BASE_VIEW);
116 elm_object_item_signal_emit(itinfo->item,
117 MUSIC_SIGNAL_ODD_ROW, MUSIC_BASE_VIEW);
119 snprintf(buf, sizeof(buf), "%d", index);
121 else if (!strcmp(part, "elm.text1"))
122 snprintf(buf, sizeof(buf), "%s", sinfo->Name());
123 else if (!strcmp(part, "elm.text2"))
124 snprintf(buf, sizeof(buf), "%s", sinfo->Artist());
125 else if (!strcmp(part, "elm.text3")) {
126 duration = sinfo->Duration();
127 timestr = _get_timestr_from_milseconds(duration);
129 snprintf(buf, sizeof(buf), "%s", timestr);
134 if (strcmp(buf, MUSIC_STR_EMPTY))
141 void CAlbumSongsLayout::sm_CbRemoveListItem(void *data, Evas_Object *obj)
147 void CAlbumSongsLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
149 CAlbumSongsLayout *root = (CAlbumSongsLayout*)dt;
152 root->m_OnCtxtUpdate(type, lid);
155 void CAlbumSongsLayout::m_OnCtxtUpdate(EActionType type, int lid)
157 Eina_List *list = NULL;
160 if (!m->ctxtinfo || !m->ctxtinfo->context)
163 if (type == ACTION_TYPE_ADDNEXT)
164 mode = ADD_TYPE_NEXT;
168 list = eina_list_append(list, m->ctxtinfo->context);
169 if (type == ACTION_TYPE_ADDTO) {
170 if (!m->mhandle->MediaAddsongsPlaylist(lid, list))
171 _ERR(" Adding songs to playlist failed ");
173 _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG);
178 m->mhandle->UpdatePlaylist(list, mode);
179 eina_list_free(list);
181 if (type == ACTION_TYPE_PLAY) {
183 m->mhandle->SetCurrentSong(((CSongInfo *)m->ctxtinfo->context)->Id());
186 _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item);
189 void CAlbumSongsLayout::sm_CbCtxtClose(void *dt)
191 CAlbumSongsLayout *root = (CAlbumSongsLayout*)dt;
194 root->m_OnCtxtClose();
197 void CAlbumSongsLayout::m_OnCtxtClose(void)
200 m->vmgr->PushView(MUSIC_BASE_VIEW, NULL);
201 elm_object_item_focus_set(m->focused_item, EINA_TRUE);
204 void CAlbumSongsLayout::sm_CbItemSelect(void *data, Evas_Object *obj, void *event_info)
206 CAlbumSongsLayout *root = (CAlbumSongsLayout*)data;
209 root->m_OnItemSelect(obj, event_info);
212 void CAlbumSongsLayout::m_OnItemSelect(Evas_Object *obj, void *event_info)
214 SAlbumSongsItemInfo *itinfo = NULL;
215 char *mediaId = NULL;
217 itinfo = m_FindItemInfoFromItem(m->it_infolist, (Elm_Object_Item *)event_info);
219 _ERR(" no item info found ");
223 mediaId = itinfo->sinfo->Id();
225 m_GotoPlayback(ADD_TYPE_FRESH, mediaId);
229 SAlbumSongsItemInfo *CAlbumSongsLayout::m_FindItemInfoFromItem(Eina_List *list, Elm_Object_Item *item)
232 SAlbumSongsItemInfo *itinfo = NULL;
235 EINA_LIST_FOREACH(list, l, obj) {
236 itinfo = (SAlbumSongsItemInfo *)obj;
237 if (itinfo->item == item)
245 void CAlbumSongsLayout::m_UpdateSongList(void)
247 CSongInfo *sinfo = NULL;
250 SAlbumSongsItemInfo *itinfo = NULL;
251 Elm_Object_Item *item = NULL;
253 CAlbumInfo *alinfo = NULL;
255 if (!m->songlist || !m->item_class)
258 /* Remove existing songlist and prepare afresh */
261 alinfo = m->mhandle->CurrentAlbum();
262 if (!m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG, alinfo, &(m->slist))) {
263 _ERR(" Fetching song list from media failed ");
267 EINA_LIST_FOREACH(m->slist, l, obj) {
268 sinfo = (CSongInfo *)obj;
269 itinfo = (SAlbumSongsItemInfo *)calloc(1, sizeof(*itinfo));
273 itinfo->sinfo = sinfo;
274 item = elm_genlist_item_append(m->songlist, m->item_class,
275 itinfo, NULL, ELM_GENLIST_ITEM_NONE, sm_CbItemSelect, this);
277 m->it_infolist = eina_list_append(m->it_infolist, itinfo);
278 dur = sinfo->Duration();
279 m->total_duration = m->total_duration + dur;
283 void CAlbumSongsLayout::m_EmptySongList(void)
286 elm_genlist_clear(m->songlist);
289 eina_list_free(m->slist);
293 if (m->it_infolist) {
294 eina_list_free(m->it_infolist);
295 m->it_infolist = NULL;
298 m->total_duration = 0;
302 int CAlbumSongsLayout::m_ConvertToMin(int milsec)
305 min = milsec / 60000; /*milli seconds per minute*/
311 void CAlbumSongsLayout::m_GotoPlayback(int mode, char *id)
313 Eina_List *list = NULL;
315 SAlbumSongsItemInfo *itinfo = NULL;
318 if (!m->it_infolist || eina_list_count(m->it_infolist) == 0) {
319 _ERR(" No songs for playback ");
323 EINA_LIST_FOREACH(m->it_infolist, l, obj) {
324 itinfo = (SAlbumSongsItemInfo *)obj;
325 list = eina_list_append(list, itinfo->sinfo);
328 m->mhandle->UpdatePlaylist(list, mode);
329 eina_list_free(list);
331 if (mode == ADD_TYPE_FRESH) {
333 if (id) /* If want to play selected song */
334 m->mhandle->SetCurrentSong(id);
337 _update_playback_view((EAddType)mode, Layout(), NULL);
341 Evas_Object *CAlbumSongsLayout::m_AddAlbumCover(void)
343 Evas_Object *album_cover = NULL;
345 album_cover = elm_image_add(Layout());
349 evas_object_size_hint_weight_set(album_cover, EVAS_HINT_EXPAND,
356 void CAlbumSongsLayout::m_CreateTopSection(void)
358 Evas_Object *thumb = NULL;
360 Evas_Object *btn[TOTAL_ADD_BTNS];
361 Evas_Object *img = NULL;
363 char buf[MAX_LENGTH];
364 CAlbumInfo *alinfo = NULL;
365 SBtnInfo btninfo[TOTAL_ADD_BTNS];
366 Evas_Object *layout = Layout();
368 btninfo[BTN_PLAY].name = MUSIC_STR_PLAY;
369 btninfo[BTN_PLAY].part = MUSIC_PART_ALBUM_PLAYBTN;
370 btninfo[BTN_PLAY].style = MUSIC_STYLE_ADD_PLAY_BTN;
371 btninfo[BTN_PLAY].icon = MUSIC_IMAGE_ADD_PLAY;
372 btninfo[BTN_PLAY].type = ALBUM_SONGS_PLAY_BUTTON;
374 btninfo[BTN_NEXT].name = MUSIC_STR_ADDNEXT;
375 btninfo[BTN_NEXT].part = MUSIC_PART_ALBUM_NEXTBTN;
376 btninfo[BTN_NEXT].style = MUSIC_STYLE_ADD_NEXT_BTN;
377 btninfo[BTN_NEXT].icon = MUSIC_IMAGE_ADD_NEXT;
378 btninfo[BTN_NEXT].type = ALBUM_SONGS_NEXT_BUTTON;
380 btninfo[BTN_LAST].name = MUSIC_STR_ADDLAST;
381 btninfo[BTN_LAST].part = MUSIC_PART_ALBUM_LASTBTN;
382 btninfo[BTN_LAST].style = MUSIC_STYLE_ADD_LAST_BTN;
383 btninfo[BTN_LAST].icon = MUSIC_IMAGE_ADD_LAST;
384 btninfo[BTN_LAST].type = ALBUM_SONGS_LAST_BUTTON;
386 thumb = m_AddAlbumCover();
390 for (i = 0; i < TOTAL_ADD_BTNS; i++) {
391 btn[i] = elm_button_add(layout);
395 evas_object_size_hint_weight_set(btn[i],
396 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
397 elm_object_text_set(btn[i], _(btninfo[i].name));
398 elm_object_style_set(btn[i], btninfo[i].style);
400 Connect(btn[i], btninfo[i].type, TYPE_MOUSE_MOVE | TYPE_CLICKED);
402 img = elm_image_add(btn[i]);
404 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
406 elm_image_file_set(img, buf, NULL);
407 elm_object_part_content_set(btn[i],
408 MUSIC_PART_ELM_SWALLOWICON, img);
411 elm_object_part_content_set(layout, btninfo[i].part,
415 elm_object_focus_set(btn[0], EINA_TRUE);
416 alinfo = m->mhandle->CurrentAlbum();
420 path = alinfo->ThumbnailPath();
422 elm_image_file_set(thumb, path, NULL);
423 elm_image_aspect_fixed_set(thumb, EINA_FALSE);
426 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
427 MUSIC_IMAGE_DEFAULT_THUMB_126);
428 elm_image_file_set(thumb, buf, NULL);
429 elm_image_no_scale_set(thumb, EINA_TRUE);
432 elm_object_part_content_set(layout, MUSIC_PART_ALBUM_THUMB,
434 elm_object_part_text_set(layout, MUSIC_PART_ALBUM_NAME,
436 elm_object_part_text_set(layout, MUSIC_PART_ALBUM_ARTIST,
439 snprintf(buf, sizeof(buf), "%d", eina_list_count(m->slist));
440 elm_object_part_text_set(layout, MUSIC_PART_ALBUM_SONGCOUNT, buf);
441 snprintf(buf, sizeof(buf), "%d %s", m_ConvertToMin(m->total_duration), _(MUSIC_TEXT_MIN));
443 elm_object_part_text_set(layout, MUSIC_PART_ALBUM_TIME, buf);
447 void CAlbumSongsLayout::m_CreateSongList(void)
449 Evas_Object *genlist = NULL;
450 Elm_Genlist_Item_Class *list_item = NULL;
451 Evas_Object *layout = Layout();
453 genlist = elm_genlist_add(layout);
457 elm_genlist_homogeneous_set(genlist, EINA_TRUE);
458 evas_object_size_hint_weight_set(genlist,
459 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
460 elm_object_part_content_set(layout, MUSIC_PART_SONGLIST, genlist);
461 Connect(genlist, ALBUM_SONGS_GENLIST, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN | TYPE_ACTIVATED);
462 m->songlist = genlist;
464 list_item = elm_genlist_item_class_new();
466 evas_object_del(genlist);
467 _ERR(" elm_genlist_item_class_new failed ");
470 list_item->item_style = MUSIC_STYLE_ALBUM_SONGLIST;
471 list_item->func.text_get = sm_CbGetListItemText;
472 list_item->func.content_get = NULL;
473 list_item->func.state_get = NULL;
474 list_item->func.del = sm_CbRemoveListItem;
475 m->item_class = list_item;
481 bool CAlbumSongsLayout::Create(CLayoutMgr *mgr)
485 Evas_Object *base = NULL;
486 Evas_Object *win = NULL;
487 Evas_Object *layout = NULL;
488 CMusicController *mhandle;
494 m = new SAlbumSongsLayout;
496 _ERR(" calloc failed ");
500 vmgr = CViewMgr::GetInstance();
502 _ERR(" get view mgr failed ");
510 _ERR(" get base failed ");
516 win = vmgr->Window();
518 _ERR(" vimewmgr get win failed ");
524 mhandle = CMusicController::GetInstance();
526 _ERR(" music controller get music instance failed ");
532 layout = _add_base(base, MUSIC_ALBUM_SONGS_LAYOUT);
534 _ERR(" get layout failed ");
540 bool r = CExtBaseLayout::Create(layout);
542 _ERR(" CBaseLayout creation failed ");
543 evas_object_del(layout);
552 m->mhandle = mhandle;
556 Connect(layout, ALBUM_SONGS_LAYOUT, TYPE_KEY_DOWN);
561 void CAlbumSongsLayout::Destroy(void)
566 CExtBaseLayout::Destroy();
567 evas_object_del(Layout());
575 void CAlbumSongsLayout::t_OnShow(void)
582 m_CreateTopSection();
584 CBaseLayout::t_OnShow();
587 parcel.ctxtInfo = NULL;
588 parcel.updateType = E_LAYOUT_UPDATE;
589 parcel.layoutId = MUSIC_ALBUM_SONGS_LAYOUT;
590 parcel.keyEvent = NULL;
591 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
595 void CAlbumSongsLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
599 case ALBUM_SONGS_LAYOUT:
600 if (!strcmp(ev->keyname, KEY_BACK)) {
602 parcel.ctxtInfo = NULL;
603 parcel.updateType = E_DEPTH_UPDATE;
604 parcel.layoutId = MUSIC_ALBUM_SONGS_LAYOUT;
605 parcel.keyEvent = NULL;
606 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
610 case ALBUM_SONGS_GENLIST:
612 Elm_Object_Item *it = NULL;
613 SContentInfo *ctxtinfo = NULL;
614 SAlbumSongsItemInfo *itinfo = NULL;
616 if (strcmp(ev->keyname, KEY_MENU))
619 it = elm_object_focused_item_get(obj);
621 _ERR(" unable to get focused item ");
624 m->focused_item = it;
631 ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
635 itinfo = m_FindItemInfoFromItem(m->it_infolist, it);
641 ctxtinfo->type = CONTEXT_TYPE_SONG;
642 ctxtinfo->context = itinfo->sinfo;
643 ctxtinfo->cbdata = this;
644 ctxtinfo->update = sm_CbCtxtUpdate;
645 ctxtinfo->close = sm_CbCtxtClose;
647 m->ctxtinfo = ctxtinfo;
650 parcel.ctxtInfo = ctxtinfo;
651 if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
652 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
662 void CAlbumSongsLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
665 case ALBUM_SONGS_GENLIST:
667 Elm_Object_Item *item;
669 item = elm_genlist_at_xy_item_get(obj, ev->cur.canvas.x,
670 ev->cur.canvas.y, NULL);
672 if (!elm_object_item_focus_get(item))
673 elm_object_item_focus_set(item, EINA_TRUE);
677 case ALBUM_SONGS_PLAY_BUTTON:
678 case ALBUM_SONGS_NEXT_BUTTON:
679 case ALBUM_SONGS_LAST_BUTTON:
681 if (!elm_object_focus_get(obj))
682 elm_object_focus_set(obj, EINA_TRUE);
692 void CAlbumSongsLayout::OnMouseClicked(int id, Evas_Object *obj)
696 case ALBUM_SONGS_PLAY_BUTTON:
697 m_GotoPlayback(ADD_TYPE_FRESH, NULL);
700 case ALBUM_SONGS_NEXT_BUTTON:
701 m_GotoPlayback(ADD_TYPE_NEXT, NULL);
704 case ALBUM_SONGS_LAST_BUTTON:
705 m_GotoPlayback(ADD_TYPE_END, NULL);
714 void CAlbumSongsLayout::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item)
717 case ALBUM_SONGS_GENLIST:
718 m_OnItemSelect(obj, item);