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) {
217 CAlbumLayout *root = (CAlbumLayout*)data;
220 root->m_OnItemSelect(it, emission, source);
224 void CAlbumLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source) {
225 SAlbumItemInfo *itinfo;
227 itinfo = m_FindItemInfo(m->it_infolist, it);
229 _ERR(" no item info found ");
233 m->mhandle->SetCurrentAlbum(itinfo->alinfo);
239 SAlbumItemInfo *CAlbumLayout::m_FindItemInfo(Eina_List *list, Elm_Object_Item *item)
242 SAlbumItemInfo *itinfo = NULL;
248 EINA_LIST_FOREACH(list, l, obj) {
249 itinfo = (SAlbumItemInfo *)obj;
250 if (itinfo->item == item)
258 SAlbumItemInfo *CAlbumLayout::m_FindItemInfoById(Eina_List *list, int alid)
261 SAlbumItemInfo *itinfo = NULL;
268 EINA_LIST_FOREACH(list, l, obj) {
269 itinfo = (SAlbumItemInfo *)obj;
272 id = itinfo->alinfo->AlbumId();
282 void CAlbumLayout::m_ShowAlbumSongs(void)
284 elm_object_part_content_unset(m->base, MUSIC_PART_CONTENT);
286 bool emptyStatus = m->layoutAlbumSongs->EmptyStatus();
288 if (emptyStatus == false) {
289 elm_object_part_content_set(m->base, MUSIC_PART_CONTENT, m->layoutAlbumSongs->Layout());
290 m->lmgr->Show(MUSIC_ALBUM_SONGS_LAYOUT);
293 if (m->callback.cbHandleEmptyStatus != NULL) {
294 m->callback.cbHandleEmptyStatus(m->callback.cookie, emptyStatus);
299 void CAlbumLayout::m_RemoveAlbumList(Eina_List *list)
301 eina_list_free(list);
305 void CAlbumLayout::m_CreateAlbumGrid(void)
308 Elm_Gengrid_Item_Class *grid_item;
310 grid = elm_gengrid_add(Layout());
314 evas_object_size_hint_weight_set(grid,
315 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
316 elm_gengrid_align_set(grid, 0, 0);
317 elm_object_part_content_set(Layout(), MUSIC_PART_ALBUM_GRID, grid);
318 Connect(grid, ALBUM_GENGRID, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN | TYPE_REALIZED | TYPE_UNREALIZED);
319 elm_gengrid_item_size_set(grid,
320 elm_config_scale_get() * GENGRID_ITEM_SIZE_W,
321 elm_config_scale_get() * GENGRID_ITEM_SIZE_H);
325 grid_item = elm_gengrid_item_class_new();
327 evas_object_del(grid);
328 _ERR(" elm_genlist_item_class_new failed ");
332 grid_item->item_style = MUSIC_STYLE_ALBUM_GRID;
333 grid_item->func.text_get = sm_CbGetGridItemText;
334 grid_item->func.content_get = sm_CbGetGridItemContent;
335 grid_item->func.state_get = NULL;
336 grid_item->func.del = sm_CbRemoveGridItem;
337 m->item_class = grid_item;
339 m_UpdateAlbumGrid(false);
343 void CAlbumLayout::m_EmptyAlbumGrid(bool sort_flag)
346 elm_gengrid_clear(m->grid);
349 m_RemoveAlbumList(m->alblist);
353 eina_list_free(m->it_infolist);
354 m->it_infolist = NULL;
358 void CAlbumLayout::m_SortAlbumGrid(void)
361 const char *sortFuncId[] = {
366 sortType = m->mhandle->SortType();
368 m->alblist = CSort::Sort(m->alblist, sortFuncId[sortType]);
372 void CAlbumLayout::m_UpdateAlbumGrid(bool sort_flag)
378 SAlbumItemInfo *itinfo;
379 Elm_Object_Item *item;
381 /* Remove existing albumgrid and prepare afresh */
382 m_EmptyAlbumGrid(sort_flag);
385 r = m->mhandle->MediaGetList(LIST_TYPE_ALBUM, NULL, &(m->alblist));
387 eina_list_count(m->alblist) == 0) {
388 _ERR(" Fetching album list from media failed ");
389 m->parent->SetEmptyStatus(true);
396 EINA_LIST_FOREACH(m->alblist, l, obj) {
397 alinfo = (CAlbumInfo *)obj;
398 itinfo = (SAlbumItemInfo *)calloc(1, sizeof(*itinfo));
402 itinfo->alinfo = alinfo;
403 item = elm_gengrid_item_append(m->grid, m->item_class, itinfo, NULL, NULL);
405 m->it_infolist = eina_list_append(m->it_infolist, itinfo);
410 bool CAlbumLayout::Create(CLayoutMgr *mgr, const char *albumId)
414 Evas_Object *base = NULL;
415 Evas_Object *win = NULL;
416 Evas_Object *layout = NULL;
417 CMusicController *mhandle = NULL;
418 CViewMgr *vmgr = NULL;
420 m = new SAlbumLayout;
422 _ERR(" albumlayout data allocation failed ");
426 vmgr = CViewMgr::GetInstance();
428 _ERR(" get viewmgr failed ");
436 _ERR(" get base failed ");
442 win = vmgr->Window();
444 _ERR(" vimewmgr get win failed ");
450 mhandle = CMusicController::GetInstance();
452 _ERR(" music controller get music instance failed ");
458 layout = _add_base(base, MUSIC_ALBUM_LAYOUT);
460 _ERR(" get layout failed ");
466 bool r = CExtBaseLayout::Create(layout);
468 _ERR(" CBaseLayout creation failed ");
469 evas_object_del(layout);
476 m->album_id = new char[strlen(albumId) + 1];
477 strcpy(m->album_id, albumId);
486 m->mhandle = mhandle;
488 m->callback.cbHandleEmptyStatus = NULL;
489 m->callback.cookie = NULL;
492 m->layoutAlbumSongs = new CAlbumSongsLayout(MUSIC_ALBUM_SONGS_LAYOUT);
493 m->layoutAlbumSongs->Create(m->lmgr);
494 m->lmgr->AddLayout(m->layoutAlbumSongs);
498 Connect(layout, ALBUM_LAYOUT, TYPE_KEY_DOWN);
501 parcel.ctxtInfo = NULL;
502 parcel.updateType = E_LAYOUT_UPDATE;
503 parcel.layoutId = MUSIC_ALBUM_LAYOUT;
504 parcel.keyEvent = NULL;
505 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
510 void CAlbumLayout::Destroy(void)
514 m->lmgr->RemoveLayout(m->layoutAlbumSongs);
515 m->layoutAlbumSongs->Destroy();
516 delete m->layoutAlbumSongs;
518 m_EmptyAlbumGrid(false);
519 CExtBaseLayout::Destroy();
520 evas_object_del(Layout());
523 delete[] m->album_id;
529 void CAlbumLayout::t_OnShow(void)
533 SAlbumItemInfo *itinfo = NULL;
535 m_UpdateAlbumGrid(false);
538 parcel.ctxtInfo = NULL;
539 parcel.updateType = E_LAYOUT_UPDATE;
540 parcel.layoutId = MUSIC_ALBUM_LAYOUT;
541 parcel.keyEvent = NULL;
542 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
544 evas_object_show(Layout());
547 itinfo = m_FindItemInfoById(m->it_infolist,
550 m->mhandle->SetCurrentAlbum(itinfo->alinfo);
554 delete[] m->album_id;
560 void CAlbumLayout::Update(bool focusFlag)
564 CAlbumInfo *alinfo = NULL;
565 SAlbumItemInfo *itinfo = NULL;
569 m_UpdateAlbumGrid(true);
573 alinfo = m->mhandle->CurrentAlbum();
575 id = alinfo->AlbumId();
576 itinfo = m_FindItemInfoById(m->it_infolist, id);
578 m->mhandle->SetCurrentAlbum(NULL);
579 elm_gengrid_item_show(itinfo->item,
580 ELM_GENGRID_ITEM_SCROLLTO_IN);
581 elm_object_item_focus_set(itinfo->item, EINA_TRUE);
586 elm_object_focus_set(m->grid, EINA_TRUE);
590 void CAlbumLayout::SetEmptyStatusHandleCallback(void(*handleEmptyStatusCb)(void *cookie, bool emptyStatus), void *cookie)
594 m->callback.cbHandleEmptyStatus = handleEmptyStatusCb;
595 m->callback.cookie = cookie;
599 void CAlbumLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
603 if (!strcmp(ev->keyname, KEY_BACK)) {
605 parcel.ctxtInfo = NULL;
606 parcel.updateType = E_FOCUS_UPDATE;
607 parcel.layoutId = NULL;
608 parcel.keyEvent = NULL;
609 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
615 Elm_Object_Item *it = NULL;
616 SContentInfo *ctxtinfo = NULL;
617 SAlbumItemInfo *itinfo = NULL;
619 if (strcmp(ev->keyname, KEY_MENU))
622 it = elm_object_focused_item_get(obj);
624 _ERR(" unable to get focused item ");
627 m->focused_item = it;
634 ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
638 itinfo = m_FindItemInfo(m->it_infolist, it);
644 ctxtinfo->type = CONTEXT_TYPE_ALBUM;
645 ctxtinfo->context = itinfo->alinfo;
646 ctxtinfo->cbdata = this;
647 ctxtinfo->update = sm_CbCtxtUpdate;
648 ctxtinfo->close = sm_CbCtxtClose;
650 m->ctxtinfo = ctxtinfo;
653 parcel.ctxtInfo = ctxtinfo;
654 if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
655 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
660 _ERR("Invalid Object");
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)
683 elm_object_item_signal_callback_add(item,
684 MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW,
685 sm_CbItemSelect, this);
689 void CAlbumLayout::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item)
691 elm_object_item_signal_callback_del(item,
692 MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW,