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>
28 #include "album_info.h"
29 #include "song_info.h"
30 #include "music-controller.h"
31 #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"
42 #define GENGRID_ITEM_SIZE_W (263+20)
43 #define GENGRID_ITEM_SIZE_H (359+20)
51 struct SAlbumItemInfo {
53 Elm_Object_Item *item;
57 void(*cbHandleEmptyStatus)(void *cookie, bool emptyStatus);
65 Elm_Object_Item *focusedItem;
67 Eina_List *it_infolist;
68 Elm_Gengrid_Item_Class *item_class;
69 CMusicController *mhandle;
72 SContentInfo *ctxtinfo;
74 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 CCommonUI::CreateMsgBox(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 CCommonUI::UpdatePlaybackView((EAddType)type, Layout(), m->focusedItem);
199 void CAlbumLayout::sm_CbCtxtClose(void *dt)
201 CAlbumLayout *root = (CAlbumLayout*)dt;
204 root->m_OnCtxtClose();
208 void CAlbumLayout::m_OnCtxtClose(void)
211 elm_object_item_focus_set(m->focusedItem, EINA_TRUE);
215 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)
226 SAlbumItemInfo *itinfo;
228 itinfo = m_FindItemInfo(m->it_infolist, it);
230 _ERR(" no item info found ");
234 m->layoutAlbumSongs->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 | TYPE_ACTIVATED);
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 = CInfo::SortType();
368 m->alblist = CSortMgr::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 SetEmptyStatus(true);
397 EINA_LIST_FOREACH(m->alblist, l, obj) {
398 alinfo = (CAlbumInfo *)obj;
399 itinfo = (SAlbumItemInfo *)calloc(1, sizeof(*itinfo));
403 itinfo->alinfo = alinfo;
404 item = elm_gengrid_item_append(m->grid, m->item_class, itinfo, NULL, NULL);
406 m->it_infolist = eina_list_append(m->it_infolist, itinfo);
408 m->focusedItem = item;
414 bool CAlbumLayout::Create(CLayoutMgr *mgr, const char *albumId)
420 Evas_Object *base = NULL;
421 Evas_Object *win = NULL;
422 Evas_Object *layout = NULL;
423 CMusicController *mhandle = NULL;
424 CViewMgr *vmgr = NULL;
425 CAlbumSongsLayout *layoutAlbumSongs = NULL;
428 _CHECK(m = new SAlbumLayout)
429 _CHECK(vmgr = CViewMgr::GetInstance())
430 _CHECK(base = mgr->Base())
431 _CHECK(win = vmgr->Window())
432 _CHECK(mhandle = CMusicController::GetInstance())
433 _CHECK(layout = CCommonUI::AddBase(base, MUSIC_ALBUM_LAYOUT))
434 _CHECK(CExtBaseLayout::Create(layout))
435 _CHECK(layoutAlbumSongs = new CAlbumSongsLayout(MUSIC_ALBUM_SONGS_LAYOUT))
436 _CHECK(layoutAlbumSongs->Create(mgr))
437 _CHECK(mgr->AddLayout(layoutAlbumSongs))
441 m->album_id = new char[strlen(albumId) + 1];
442 strcpy(m->album_id, albumId);
450 m->mhandle = mhandle;
452 m->callback.cbHandleEmptyStatus = NULL;
453 m->callback.cookie = NULL;
454 m->layoutAlbumSongs = layoutAlbumSongs;
457 Connect(layout, ALBUM_LAYOUT, TYPE_KEY_DOWN);
459 parcel.ctxtInfo = NULL;
460 parcel.updateType = E_LAYOUT_UPDATE;
461 parcel.layoutId = MUSIC_ALBUM_LAYOUT;
462 parcel.keyEvent = NULL;
463 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
466 _CHECK_FAIL{ mgr->RemoveLayout(layoutAlbumSongs); }
467 _CHECK_FAIL{ m->layoutAlbumSongs->Destroy(); }
468 _CHECK_FAIL{ delete m->layoutAlbumSongs; }
469 _CHECK_FAIL{ CExtBaseLayout::Destroy(); }
470 _CHECK_FAIL{ evas_object_del(layout); }
475 _CHECK_FAIL{ delete m; m = NULL; }
476 } _CREATE_END_AND_CATCH{ return false; }
481 void CAlbumLayout::Destroy(void)
485 Disconnect(Layout());
487 m->lmgr->RemoveLayout(m->layoutAlbumSongs);
488 m->layoutAlbumSongs->Destroy();
489 delete m->layoutAlbumSongs;
491 m_EmptyAlbumGrid(false);
492 CExtBaseLayout::Destroy();
493 evas_object_del(Layout());
496 delete[] m->album_id;
502 void CAlbumLayout::t_OnShow(void)
506 SAlbumItemInfo *itinfo = NULL;
508 m_UpdateAlbumGrid(false);
511 memset(&parcel, 0, sizeof(SParcel));
512 parcel.updateType = E_LAYOUT_UPDATE;
513 parcel.layoutId = MUSIC_ALBUM_LAYOUT;
514 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
516 evas_object_show(Layout());
519 itinfo = m_FindItemInfoById(m->it_infolist,
522 m->layoutAlbumSongs->SetCurrentAlbum(itinfo->alinfo);
526 delete[] m->album_id;
532 void CAlbumLayout::Update(bool focusFlag)
536 CAlbumInfo *alinfo = NULL;
537 SAlbumItemInfo *itinfo = NULL;
541 m_UpdateAlbumGrid(true);
545 alinfo = m->layoutAlbumSongs->CurrentAlbum();
547 id = alinfo->AlbumId();
548 itinfo = m_FindItemInfoById(m->it_infolist, id);
550 m->layoutAlbumSongs->SetCurrentAlbum(NULL);
552 elm_gengrid_item_show(itinfo->item,
553 ELM_GENGRID_ITEM_SCROLLTO_IN);
554 elm_object_item_focus_set(itinfo->item, EINA_TRUE);
559 elm_object_focus_set(m->grid, EINA_TRUE);
563 void CAlbumLayout::SetFocus(const char *btnStr)
566 ASSERT(m->focusedItem);
568 elm_gengrid_item_show(m->focusedItem, ELM_GENGRID_ITEM_SCROLLTO_IN);
569 elm_object_item_focus_set(m->focusedItem, EINA_TRUE);
573 void CAlbumLayout::SetEmptyStatusHandleCallback(void(*handleEmptyStatusCb)(void *cookie, bool emptyStatus), void *cookie)
577 m->callback.cbHandleEmptyStatus = handleEmptyStatusCb;
578 m->callback.cookie = cookie;
582 void CAlbumLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
586 if (!strcmp(ev->keyname, KEY_BACK) ||
587 !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
589 memset(&parcel, 0, sizeof(SParcel));
590 parcel.updateType = E_FOCUS_UPDATE;
591 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
597 Elm_Object_Item *it = NULL;
598 SContentInfo *ctxtinfo = NULL;
599 SAlbumItemInfo *itinfo = NULL;
601 it = elm_object_focused_item_get(obj);
603 _ERR(" unable to get focused item ");
609 if (!strcmp(ev->keyname, KEY_MENU) ||
610 !strcmp(ev->keyname, KEY_MENU_REMOTE)) {
616 ctxtinfo = (SContentInfo *)calloc(1, sizeof(*ctxtinfo));
620 itinfo = m_FindItemInfo(m->it_infolist, it);
626 ctxtinfo->type = CONTEXT_TYPE_ALBUM;
627 ctxtinfo->context = itinfo->alinfo;
628 ctxtinfo->cbdata = this;
629 ctxtinfo->update = sm_CbCtxtUpdate;
630 ctxtinfo->close = sm_CbCtxtClose;
632 m->ctxtinfo = ctxtinfo;
635 memset(&parcel, 0, sizeof(SParcel));
636 parcel.ctxtInfo = ctxtinfo;
637 if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
638 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
649 void CAlbumLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
654 Elm_Object_Item *item;
656 item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x,
657 ev->cur.canvas.y, NULL, NULL);
661 if (!elm_object_item_focus_get(item))
662 elm_object_item_focus_set(item, EINA_TRUE);
664 m->focusedItem = item;
674 void CAlbumLayout::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
679 elm_object_item_signal_callback_add(item,
680 MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW,
681 sm_CbItemSelect, this);
691 void CAlbumLayout::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item)
696 elm_object_item_signal_callback_del(item,
697 MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW,
708 void CAlbumLayout::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item)
712 m_OnItemSelect(item, NULL, NULL);