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>
21 #include <InputHandler.h>
27 #include "album_info.h"
28 #include "song_info.h"
29 #include "music-controller.h"
30 #include "LayoutMgr.h"
32 #include "common-ui.h"
34 #include "BaseLayout.h"
35 #include "ExtBaseLayout.h"
37 #include "album-layout.h"
38 #include "album-songs-layout.h"
39 #include "base-view.h"
41 #define GENGRID_ITEM_SIZE_W (263+20)
42 #define GENGRID_ITEM_SIZE_H (359+20)
50 struct SAlbumItemInfo {
52 Elm_Object_Item *item;
56 void(*cbHandleEmptyStatus)(void *cookie, bool emptyStatus);
64 Elm_Object_Item *focused_item;
66 Eina_List *it_infolist;
67 Elm_Gengrid_Item_Class *item_class;
68 CMusicController *mhandle;
71 SContentInfo *ctxtinfo;
73 CAlbumSongsLayout *layoutAlbumSongs;
78 memset(this, 0, sizeof(SAlbumLayout));
86 char *CAlbumLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part)
88 SAlbumItemInfo *itinfo = (SAlbumItemInfo *)data;
89 CAlbumInfo *alinfo = NULL;
95 alinfo = itinfo->alinfo;
98 if (!strcmp(part, "elm.text"))
100 else if (!strcmp(part, "elm.text1"))
101 txt = alinfo->Artist();
110 Evas_Object *CAlbumLayout::sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part)
112 SAlbumItemInfo *itinfo = (SAlbumItemInfo *)data;
113 CAlbumInfo *alinfo = NULL;
115 Evas_Object *img = NULL;
116 char buf[MAX_LENGTH];
121 alinfo = itinfo->alinfo;
123 if (!strcmp(part, "elm.swallow.icon")) {
124 img = elm_image_add(obj);
128 path = alinfo->ThumbnailPath();
130 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
131 MUSIC_IMAGE_DEFAULT_THUMB_126);
132 elm_image_file_set(img, buf, "NULL");
133 elm_image_no_scale_set(img, EINA_TRUE);
136 elm_image_file_set(img, path, "NULL");
137 elm_image_aspect_fixed_set(img, EINA_FALSE);
146 void CAlbumLayout::sm_CbRemoveGridItem(void *data, Evas_Object *obj)
152 void CAlbumLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
154 CAlbumLayout *root = (CAlbumLayout*)dt;
157 root->m_OnCtxtUpdate(type, lid);
161 void CAlbumLayout::m_OnCtxtUpdate(EActionType type, int lid)
163 Eina_List *list = NULL;
164 CSongInfo *sinfo = NULL;
167 if (!m->ctxtinfo || !m->ctxtinfo->context)
170 if (type == ACTION_TYPE_ADDNEXT)
171 mode = ADD_TYPE_NEXT;
175 m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG,
176 m->ctxtinfo->context, &list);
177 if (type == ACTION_TYPE_ADDTO) {
178 if (!m->mhandle->MediaAddsongsPlaylist(lid, list))
179 _ERR(" Adding songs to playlist failed ");
181 _create_message_box(m->base, MUSIC_TEXT_ADDTO_MSG);
186 m->mhandle->UpdatePlaylist(list, mode);
187 sinfo = (CSongInfo *)eina_list_data_get(list);
188 eina_list_free(list);
190 if (type == ACTION_TYPE_PLAY) {
192 m->mhandle->SetCurrentSong(sinfo->Id());
195 _update_playback_view((EAddType)type, m->parent->Layout(), m->focused_item);
199 void CAlbumLayout::sm_CbCtxtClose(void *dt)
201 CAlbumLayout *root = (CAlbumLayout*)dt;
204 root->m_OnCtxtClose();
208 void CAlbumLayout::m_OnCtxtClose(void)
211 m->vmgr->PushView(MUSIC_BASE_VIEW, NULL);
212 elm_object_item_focus_set(m->focused_item, EINA_TRUE);
216 void CAlbumLayout::sm_CbItemSelect(void *data, Elm_Object_Item *it, const char *emission, const char *source)
218 CAlbumLayout *root = (CAlbumLayout*)data;
221 root->m_OnItemSelect(it, emission, source);
225 void CAlbumLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source)
227 SAlbumItemInfo *itinfo;
229 itinfo = m_FindItemInfo(m->it_infolist, it);
231 _ERR(" no item info found ");
235 m->mhandle->SetCurrentAlbum(itinfo->alinfo);
241 SAlbumItemInfo *CAlbumLayout::m_FindItemInfo(Eina_List *list, Elm_Object_Item *item)
244 SAlbumItemInfo *itinfo = NULL;
250 EINA_LIST_FOREACH(list, l, obj) {
251 itinfo = (SAlbumItemInfo *)obj;
252 if (itinfo->item == item)
260 SAlbumItemInfo *CAlbumLayout::m_FindItemInfoById(Eina_List *list, int alid)
263 SAlbumItemInfo *itinfo = NULL;
270 EINA_LIST_FOREACH(list, l, obj) {
271 itinfo = (SAlbumItemInfo *)obj;
274 id = itinfo->alinfo->AlbumId();
284 void CAlbumLayout::m_ShowAlbumSongs(void)
286 elm_object_part_content_unset(m->base, MUSIC_PART_CONTENT);
288 bool emptyStatus = m->layoutAlbumSongs->EmptyStatus();
290 if (emptyStatus == false) {
291 elm_object_part_content_set(m->base, MUSIC_PART_CONTENT, m->layoutAlbumSongs->Layout());
292 m->lmgr->Show(MUSIC_ALBUM_SONGS_LAYOUT);
295 if (m->callback.cbHandleEmptyStatus != NULL) {
296 m->callback.cbHandleEmptyStatus(m->callback.cookie, emptyStatus);
301 void CAlbumLayout::m_RemoveAlbumList(Eina_List *list)
303 eina_list_free(list);
307 void CAlbumLayout::m_CreateAlbumGrid(void)
310 Elm_Gengrid_Item_Class *grid_item;
312 grid = elm_gengrid_add(Layout());
316 evas_object_size_hint_weight_set(grid,
317 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
318 elm_gengrid_align_set(grid, 0, 0);
319 elm_object_part_content_set(Layout(), MUSIC_PART_ALBUM_GRID, grid);
320 Connect(grid, ALBUM_GENGRID, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN | TYPE_REALIZED | TYPE_UNREALIZED | TYPE_ACTIVATED);
321 elm_gengrid_item_size_set(grid,
322 elm_config_scale_get() * GENGRID_ITEM_SIZE_W,
323 elm_config_scale_get() * GENGRID_ITEM_SIZE_H);
327 grid_item = elm_gengrid_item_class_new();
329 evas_object_del(grid);
330 _ERR(" elm_genlist_item_class_new failed ");
334 grid_item->item_style = MUSIC_STYLE_ALBUM_GRID;
335 grid_item->func.text_get = sm_CbGetGridItemText;
336 grid_item->func.content_get = sm_CbGetGridItemContent;
337 grid_item->func.state_get = NULL;
338 grid_item->func.del = sm_CbRemoveGridItem;
339 m->item_class = grid_item;
341 m_UpdateAlbumGrid(false);
345 void CAlbumLayout::m_EmptyAlbumGrid(bool sort_flag)
348 elm_gengrid_clear(m->grid);
351 m_RemoveAlbumList(m->alblist);
355 eina_list_free(m->it_infolist);
356 m->it_infolist = NULL;
360 void CAlbumLayout::m_SortAlbumGrid(void)
363 const char *sortFuncId[] = {
368 sortType = m->mhandle->SortType();
370 m->alblist = CSort::Sort(m->alblist, sortFuncId[sortType]);
374 void CAlbumLayout::m_UpdateAlbumGrid(bool sort_flag)
380 SAlbumItemInfo *itinfo;
381 Elm_Object_Item *item;
383 /* Remove existing albumgrid and prepare afresh */
384 m_EmptyAlbumGrid(sort_flag);
387 r = m->mhandle->MediaGetList(LIST_TYPE_ALBUM, NULL, &(m->alblist));
389 eina_list_count(m->alblist) == 0) {
390 _ERR(" Fetching album list from media failed ");
391 m->parent->SetEmptyStatus(true);
398 EINA_LIST_FOREACH(m->alblist, l, obj) {
399 alinfo = (CAlbumInfo *)obj;
400 itinfo = (SAlbumItemInfo *)calloc(1, sizeof(*itinfo));
404 itinfo->alinfo = alinfo;
405 item = elm_gengrid_item_append(m->grid, m->item_class, itinfo, NULL, NULL);
407 m->it_infolist = eina_list_append(m->it_infolist, itinfo);
412 bool CAlbumLayout::Create(CLayoutMgr *mgr, const char *albumId)
416 Evas_Object *base = NULL;
417 Evas_Object *win = NULL;
418 Evas_Object *layout = NULL;
419 CMusicController *mhandle = NULL;
420 CViewMgr *vmgr = NULL;
422 m = new SAlbumLayout;
424 _ERR(" albumlayout data allocation failed ");
428 vmgr = CViewMgr::GetInstance();
430 _ERR(" get viewmgr failed ");
438 _ERR(" get base failed ");
444 win = vmgr->Window();
446 _ERR(" vimewmgr get win failed ");
452 mhandle = CMusicController::GetInstance();
454 _ERR(" music controller get music instance failed ");
460 layout = _add_base(base, MUSIC_ALBUM_LAYOUT);
462 _ERR(" get layout failed ");
468 bool r = CExtBaseLayout::Create(layout);
470 _ERR(" CBaseLayout creation failed ");
471 evas_object_del(layout);
478 m->album_id = new char[strlen(albumId) + 1];
479 strcpy(m->album_id, albumId);
488 m->mhandle = mhandle;
490 m->callback.cbHandleEmptyStatus = NULL;
491 m->callback.cookie = NULL;
494 m->layoutAlbumSongs = new CAlbumSongsLayout(MUSIC_ALBUM_SONGS_LAYOUT);
495 m->layoutAlbumSongs->Create(m->lmgr);
496 m->lmgr->AddLayout(m->layoutAlbumSongs);
500 Connect(layout, ALBUM_LAYOUT, TYPE_KEY_DOWN);
503 parcel.ctxtInfo = NULL;
504 parcel.updateType = E_LAYOUT_UPDATE;
505 parcel.layoutId = MUSIC_ALBUM_LAYOUT;
506 parcel.keyEvent = NULL;
507 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
512 void CAlbumLayout::Destroy(void)
516 m->lmgr->RemoveLayout(m->layoutAlbumSongs);
517 m->layoutAlbumSongs->Destroy();
518 delete m->layoutAlbumSongs;
520 m_EmptyAlbumGrid(false);
521 CExtBaseLayout::Destroy();
522 evas_object_del(Layout());
525 delete[] m->album_id;
531 void CAlbumLayout::t_OnShow(void)
535 SAlbumItemInfo *itinfo = NULL;
537 m_UpdateAlbumGrid(false);
540 parcel.ctxtInfo = NULL;
541 parcel.updateType = E_LAYOUT_UPDATE;
542 parcel.layoutId = MUSIC_ALBUM_LAYOUT;
543 parcel.keyEvent = NULL;
544 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
546 evas_object_show(Layout());
549 itinfo = m_FindItemInfoById(m->it_infolist,
552 m->mhandle->SetCurrentAlbum(itinfo->alinfo);
556 delete[] m->album_id;
562 void CAlbumLayout::Update(bool focusFlag)
566 CAlbumInfo *alinfo = NULL;
567 SAlbumItemInfo *itinfo = NULL;
571 m_UpdateAlbumGrid(true);
575 alinfo = m->mhandle->CurrentAlbum();
577 id = alinfo->AlbumId();
578 itinfo = m_FindItemInfoById(m->it_infolist, id);
580 m->mhandle->SetCurrentAlbum(NULL);
581 elm_gengrid_item_show(itinfo->item,
582 ELM_GENGRID_ITEM_SCROLLTO_IN);
583 elm_object_item_focus_set(itinfo->item, EINA_TRUE);
588 elm_object_focus_set(m->grid, EINA_TRUE);
592 void CAlbumLayout::SetEmptyStatusHandleCallback(void(*handleEmptyStatusCb)(void *cookie, bool emptyStatus), void *cookie)
596 m->callback.cbHandleEmptyStatus = handleEmptyStatusCb;
597 m->callback.cookie = cookie;
601 void CAlbumLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
605 if (!strcmp(ev->keyname, KEY_BACK)) {
607 parcel.ctxtInfo = NULL;
608 parcel.updateType = E_FOCUS_UPDATE;
609 parcel.layoutId = NULL;
610 parcel.keyEvent = NULL;
611 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
617 Elm_Object_Item *it = NULL;
618 SContentInfo *ctxtinfo = NULL;
619 SAlbumItemInfo *itinfo = NULL;
621 if (strcmp(ev->keyname, KEY_MENU))
624 it = elm_object_focused_item_get(obj);
626 _ERR(" unable to get focused item ");
629 m->focused_item = it;
636 ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
640 itinfo = m_FindItemInfo(m->it_infolist, it);
646 ctxtinfo->type = CONTEXT_TYPE_ALBUM;
647 ctxtinfo->context = itinfo->alinfo;
648 ctxtinfo->cbdata = this;
649 ctxtinfo->update = sm_CbCtxtUpdate;
650 ctxtinfo->close = sm_CbCtxtClose;
652 m->ctxtinfo = ctxtinfo;
655 parcel.ctxtInfo = ctxtinfo;
656 if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
657 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
667 void CAlbumLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
669 Elm_Object_Item *item;
671 item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x,
672 ev->cur.canvas.y, NULL, NULL);
676 if (!elm_object_item_focus_get(item))
677 elm_object_item_focus_set(item, EINA_TRUE);
681 void CAlbumLayout::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
686 elm_object_item_signal_callback_add(item,
687 MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW,
688 sm_CbItemSelect, this);
698 void CAlbumLayout::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item)
703 elm_object_item_signal_callback_del(item,
704 MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW,
715 void CAlbumLayout::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item)
719 m_OnItemSelect(item, NULL, NULL);