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;
76 Ecore_Idler *focusIdler;
79 memset(this, 0, sizeof(SAlbumLayout));
87 Eina_Bool CAlbumLayout::sm_CbFocusIdler(void *dt)
89 CAlbumLayout *root = (CAlbumLayout *)dt;
92 root->m_OnFocusIdler();
94 return ECORE_CALLBACK_CANCEL;
98 void CAlbumLayout::m_OnFocusIdler(void)
100 m->focusIdler = NULL;
102 ASSERT(m->focusedItem);
103 elm_gengrid_item_show(m->focusedItem, ELM_GENGRID_ITEM_SCROLLTO_IN);
104 elm_object_item_focus_set(m->focusedItem, EINA_TRUE);
108 char *CAlbumLayout::sm_CbGetGridItemText(void *data, Evas_Object *obj, const char *part)
110 SAlbumItemInfo *itinfo = (SAlbumItemInfo *)data;
111 CAlbumInfo *alinfo = NULL;
117 alinfo = itinfo->alinfo;
120 if (!strcmp(part, "elm.text"))
121 txt = alinfo->Name();
122 else if (!strcmp(part, "elm.text1"))
123 txt = alinfo->Artist();
132 Evas_Object *CAlbumLayout::sm_CbGetGridItemContent(void *data, Evas_Object *obj, const char *part)
134 SAlbumItemInfo *itinfo = (SAlbumItemInfo *)data;
135 CAlbumInfo *alinfo = NULL;
137 Evas_Object *img = NULL;
138 char buf[MAX_LENGTH];
143 alinfo = itinfo->alinfo;
145 if (!strcmp(part, "elm.swallow.icon")) {
146 img = elm_image_add(obj);
150 path = alinfo->ThumbnailPath();
152 snprintf(buf, sizeof(buf), "%s/%s", IMAGEDIR,
153 MUSIC_IMAGE_DEFAULT_THUMB_126);
154 elm_image_file_set(img, buf, "NULL");
155 elm_image_no_scale_set(img, EINA_TRUE);
158 elm_image_file_set(img, path, "NULL");
159 elm_image_aspect_fixed_set(img, EINA_FALSE);
168 void CAlbumLayout::sm_CbRemoveGridItem(void *data, Evas_Object *obj)
174 void CAlbumLayout::sm_CbCtxtUpdate(void *dt, enum EActionType type, int lid)
176 CAlbumLayout *root = (CAlbumLayout*)dt;
179 root->m_OnCtxtUpdate(type, lid);
183 void CAlbumLayout::m_OnCtxtUpdate(EActionType type, int lid)
185 Eina_List *list = NULL;
186 CSongInfo *sinfo = NULL;
189 if (!m->ctxtinfo || !m->ctxtinfo->context)
192 if (type == ACTION_TYPE_ADDNEXT)
193 mode = ADD_TYPE_NEXT;
197 m->mhandle->MediaGetList(LIST_TYPE_ALBUM_SONG,
198 m->ctxtinfo->context, &list);
199 if (type == ACTION_TYPE_ADDTO) {
200 if (!m->mhandle->MediaAddsongsPlaylist(lid, list))
201 _ERR(" Adding songs to playlist failed ");
203 CCommonUI::CreateMsgBox(m->base, MUSIC_TEXT_ADDTO_MSG);
208 m->mhandle->UpdatePlaylist(list, mode);
209 sinfo = (CSongInfo *)eina_list_data_get(list);
210 eina_list_free(list);
212 if (type == ACTION_TYPE_PLAY) {
214 m->mhandle->SetCurrentSong(sinfo->Id());
217 CCommonUI::UpdatePlaybackView((EAddType)type, Layout(), m->focusedItem);
221 void CAlbumLayout::sm_CbCtxtClose(void *dt)
223 CAlbumLayout *root = (CAlbumLayout*)dt;
226 root->m_OnCtxtClose();
230 void CAlbumLayout::m_OnCtxtClose(void)
233 m->vmgr->PushView(MUSIC_BASE_VIEW, NULL);
234 elm_object_item_focus_set(m->focusedItem, EINA_TRUE);
238 void CAlbumLayout::sm_CbItemSelect(void *data, Elm_Object_Item *it, const char *emission, const char *source)
240 CAlbumLayout *root = (CAlbumLayout*)data;
243 root->m_OnItemSelect(it, emission, source);
247 void CAlbumLayout::m_OnItemSelect(Elm_Object_Item *it, const char *emission, const char *source)
249 SAlbumItemInfo *itinfo;
251 itinfo = m_FindItemInfo(m->it_infolist, it);
253 _ERR(" no item info found ");
257 m->layoutAlbumSongs->SetCurrentAlbum(itinfo->alinfo);
262 SAlbumItemInfo *CAlbumLayout::m_FindItemInfo(Eina_List *list, Elm_Object_Item *item)
265 SAlbumItemInfo *itinfo = NULL;
271 EINA_LIST_FOREACH(list, l, obj) {
272 itinfo = (SAlbumItemInfo *)obj;
273 if (itinfo->item == item)
281 SAlbumItemInfo *CAlbumLayout::m_FindItemInfoById(Eina_List *list, int alid)
284 SAlbumItemInfo *itinfo = NULL;
291 EINA_LIST_FOREACH(list, l, obj) {
292 itinfo = (SAlbumItemInfo *)obj;
295 id = itinfo->alinfo->AlbumId();
305 void CAlbumLayout::m_ShowAlbumSongs(void)
307 elm_object_part_content_unset(m->base, MUSIC_PART_CONTENT);
309 bool emptyStatus = m->layoutAlbumSongs->EmptyStatus();
311 if (emptyStatus == false) {
312 elm_object_part_content_set(m->base, MUSIC_PART_CONTENT, m->layoutAlbumSongs->Layout());
313 m->lmgr->Show(MUSIC_ALBUM_SONGS_LAYOUT);
316 if (m->callback.cbHandleEmptyStatus != NULL) {
317 m->callback.cbHandleEmptyStatus(m->callback.cookie, emptyStatus);
322 void CAlbumLayout::m_RemoveAlbumList(Eina_List *list)
324 eina_list_free(list);
328 void CAlbumLayout::m_CreateAlbumGrid(void)
331 Elm_Gengrid_Item_Class *grid_item;
333 grid = elm_gengrid_add(Layout());
337 evas_object_size_hint_weight_set(grid,
338 EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
339 elm_gengrid_align_set(grid, 0, 0);
340 elm_object_part_content_set(Layout(), MUSIC_PART_ALBUM_GRID, grid);
341 Connect(grid, ALBUM_GENGRID, TYPE_MOUSE_MOVE | TYPE_KEY_DOWN | TYPE_REALIZED | TYPE_UNREALIZED | TYPE_ACTIVATED);
342 elm_gengrid_item_size_set(grid,
343 elm_config_scale_get() * GENGRID_ITEM_SIZE_W,
344 elm_config_scale_get() * GENGRID_ITEM_SIZE_H);
348 grid_item = elm_gengrid_item_class_new();
350 evas_object_del(grid);
351 _ERR(" elm_genlist_item_class_new failed ");
355 grid_item->item_style = MUSIC_STYLE_ALBUM_GRID;
356 grid_item->func.text_get = sm_CbGetGridItemText;
357 grid_item->func.content_get = sm_CbGetGridItemContent;
358 grid_item->func.state_get = NULL;
359 grid_item->func.del = sm_CbRemoveGridItem;
360 m->item_class = grid_item;
362 m_UpdateAlbumGrid(false);
366 void CAlbumLayout::m_EmptyAlbumGrid(bool sort_flag)
369 elm_gengrid_clear(m->grid);
372 m_RemoveAlbumList(m->alblist);
376 eina_list_free(m->it_infolist);
377 m->it_infolist = NULL;
381 void CAlbumLayout::m_SortAlbumGrid(void)
384 const char *sortFuncId[] = {
389 sortType = CInfo::SortType();
391 m->alblist = CSortMgr::Sort(m->alblist, sortFuncId[sortType]);
395 void CAlbumLayout::m_UpdateAlbumGrid(bool sort_flag)
401 SAlbumItemInfo *itinfo;
402 Elm_Object_Item *item;
404 /* Remove existing albumgrid and prepare afresh */
405 m_EmptyAlbumGrid(sort_flag);
408 r = m->mhandle->MediaGetList(LIST_TYPE_ALBUM, NULL, &(m->alblist));
410 eina_list_count(m->alblist) == 0) {
411 _ERR(" Fetching album list from media failed ");
412 SetEmptyStatus(true);
420 EINA_LIST_FOREACH(m->alblist, l, obj) {
421 alinfo = (CAlbumInfo *)obj;
422 itinfo = (SAlbumItemInfo *)calloc(1, sizeof(*itinfo));
426 itinfo->alinfo = alinfo;
427 item = elm_gengrid_item_append(m->grid, m->item_class, itinfo, NULL, NULL);
429 m->it_infolist = eina_list_append(m->it_infolist, itinfo);
431 m->focusedItem = item;
437 bool CAlbumLayout::Create(CLayoutMgr *mgr, const char *albumId)
443 Evas_Object *base = NULL;
444 Evas_Object *win = NULL;
445 Evas_Object *layout = NULL;
446 CMusicController *mhandle = NULL;
447 CViewMgr *vmgr = NULL;
448 CAlbumSongsLayout *layoutAlbumSongs = NULL;
451 _CHECK(m = new SAlbumLayout)
452 _CHECK(vmgr = CViewMgr::GetInstance())
453 _CHECK(base = mgr->Base())
454 _CHECK(win = vmgr->Window())
455 _CHECK(mhandle = CMusicController::GetInstance())
456 _CHECK(layout = CCommonUI::AddBase(base, MUSIC_ALBUM_LAYOUT))
457 _CHECK(CExtBaseLayout::Create(layout))
458 _CHECK(layoutAlbumSongs = new CAlbumSongsLayout(MUSIC_ALBUM_SONGS_LAYOUT))
459 _CHECK(layoutAlbumSongs->Create(mgr))
460 _CHECK(mgr->AddLayout(layoutAlbumSongs))
464 m->album_id = new char[strlen(albumId) + 1];
465 strcpy(m->album_id, albumId);
473 m->mhandle = mhandle;
475 m->callback.cbHandleEmptyStatus = NULL;
476 m->callback.cookie = NULL;
477 m->layoutAlbumSongs = layoutAlbumSongs;
480 Connect(layout, ALBUM_LAYOUT, TYPE_KEY_DOWN);
482 parcel.ctxtInfo = NULL;
483 parcel.updateType = E_LAYOUT_UPDATE;
484 parcel.layoutId = MUSIC_ALBUM_LAYOUT;
485 parcel.keyEvent = NULL;
486 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
489 _CHECK_FAIL{ mgr->RemoveLayout(layoutAlbumSongs); }
490 _CHECK_FAIL{ m->layoutAlbumSongs->Destroy(); }
491 _CHECK_FAIL{ delete m->layoutAlbumSongs; }
492 _CHECK_FAIL{ CExtBaseLayout::Destroy(); }
493 _CHECK_FAIL{ evas_object_del(layout); }
498 _CHECK_FAIL{ delete m; m = NULL; }
499 } _CREATE_END_AND_CATCH{ return false; }
504 void CAlbumLayout::Destroy(void)
508 Disconnect(Layout());
510 m->lmgr->RemoveLayout(m->layoutAlbumSongs);
511 m->layoutAlbumSongs->Destroy();
512 delete m->layoutAlbumSongs;
514 m_EmptyAlbumGrid(false);
515 CExtBaseLayout::Destroy();
516 evas_object_del(Layout());
519 delete[] m->album_id;
525 void CAlbumLayout::t_OnShow(void)
529 SAlbumItemInfo *itinfo = NULL;
531 m_UpdateAlbumGrid(false);
534 memset(&parcel, 0, sizeof(SParcel));
535 parcel.updateType = E_LAYOUT_UPDATE;
536 parcel.layoutId = MUSIC_ALBUM_LAYOUT;
537 m->vmgr->UpdateView((const char *)MUSIC_BASE_VIEW, &parcel);
539 evas_object_show(Layout());
542 itinfo = m_FindItemInfoById(m->it_infolist,
545 m->layoutAlbumSongs->SetCurrentAlbum(itinfo->alinfo);
549 delete[] m->album_id;
555 void CAlbumLayout::Update(bool focusFlag)
559 CAlbumInfo *alinfo = NULL;
560 SAlbumItemInfo *itinfo = NULL;
564 m_UpdateAlbumGrid(true);
568 alinfo = m->layoutAlbumSongs->CurrentAlbum();
570 id = alinfo->AlbumId();
571 itinfo = m_FindItemInfoById(m->it_infolist, id);
573 m->layoutAlbumSongs->SetCurrentAlbum(NULL);
575 elm_gengrid_item_show(itinfo->item,
576 ELM_GENGRID_ITEM_SCROLLTO_IN);
577 elm_object_item_focus_set(itinfo->item, EINA_TRUE);
582 elm_object_focus_set(m->grid, EINA_TRUE);
586 void CAlbumLayout::SetFocus(const char *btnStr)
589 m->focusIdler = ecore_idler_add(sm_CbFocusIdler, this);
593 void CAlbumLayout::SetEmptyStatusHandleCallback(void(*handleEmptyStatusCb)(void *cookie, bool emptyStatus), void *cookie)
597 m->callback.cbHandleEmptyStatus = handleEmptyStatusCb;
598 m->callback.cookie = cookie;
602 void CAlbumLayout::OnKeyDown(int id, Evas *e, Evas_Object *obj, Evas_Event_Key_Down *ev)
606 if (!strcmp(ev->keyname, KEY_BACK) ||
607 !strcmp(ev->keyname, KEY_BACK_REMOTE)) {
609 memset(&parcel, 0, sizeof(SParcel));
610 parcel.updateType = E_FOCUS_UPDATE;
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 it = elm_object_focused_item_get(obj);
623 _ERR(" unable to get focused item ");
629 if (!strcmp(ev->keyname, KEY_MENU) ||
630 !strcmp(ev->keyname, KEY_MENU_REMOTE)) {
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 memset(&parcel, 0, sizeof(SParcel));
656 parcel.ctxtInfo = ctxtinfo;
657 if (!m->vmgr->PushView(MUSIC_CONTEXT_VIEW, &parcel))
658 _ERR("viewmgr push view MUSIC_CONTEXT_VIEW failed");
669 void CAlbumLayout::OnMouseMove(int id, Evas *e, Evas_Object *obj, Evas_Event_Mouse_Move *ev)
674 Elm_Object_Item *item;
676 item = elm_gengrid_at_xy_item_get(obj, ev->cur.canvas.x,
677 ev->cur.canvas.y, NULL, NULL);
681 if (!elm_object_item_focus_get(item))
682 elm_object_item_focus_set(item, EINA_TRUE);
684 m->focusedItem = item;
694 void CAlbumLayout::OnRealized(int id, Evas_Object *obj, Elm_Object_Item *item)
699 elm_object_item_signal_callback_add(item,
700 MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW,
701 sm_CbItemSelect, this);
711 void CAlbumLayout::OnUnrealized(int id, Evas_Object *obj, Elm_Object_Item *item)
716 elm_object_item_signal_callback_del(item,
717 MUSIC_SIGNAL_BTN_CLICKED, MUSIC_BASE_VIEW,
728 void CAlbumLayout::OnActivated(int id, Evas_Object *obj, Elm_Object_Item *item)
732 m_OnItemSelect(item, NULL, NULL);